Add the Labs projects provided in the V10.2.1_191129 zip file.
diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/DemoTasks/LightWeightMQTTExample.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/DemoTasks/LightWeightMQTTExample.c
new file mode 100644
index 0000000..aabb3a6
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/DemoTasks/LightWeightMQTTExample.c
@@ -0,0 +1,853 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/*

+ * Proof of Concept for use of MQTT light weight serializer API.

+ * Light weight serializer API lets user to serialize and

+ * deserialize MQTT messages into user provided buffer.

+ * This API allows use of statically allocated buffer.

+ *

+ * Example shown below uses this API to create MQTT messages and

+ * and send them over connection established using FreeRTOS sockets.

+ * The example is single threaded and uses statically allocated memory.

+ *

+ * !!! NOTE !!!

+ * This is work in progress to show how light weight serializer

+ * API can be used. This is not a complete demo, and should not

+ * be treated as production ready code.

+ */

+

+/* Standard includes. */

+#include <string.h>

+#include <stdio.h>

+

+/* Kernel includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+TCP includes. */

+#include "FreeRTOS_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+/* IoT SDK includes. */

+#include "iot_mqtt.h"

+#include "iot_mqtt_serialize.h"

+#include "platform/iot_network_freertos.h"

+

+/* Demo Specific configs. */

+#include "mqtt_demo_profile.h"

+

+

+/**

+ * @brief Time to wait between each cycle of the demo implemented by prvMQTTDemoTask().

+ */

+#define mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS	( pdMS_TO_TICKS( 5000 ) )

+

+/**

+ * @brief Time to wait before sending ping request to keep MQTT connection alive.

+ */

+#define mqttexampleKEEP_ALIVE_DELAY					( pdMS_TO_TICKS( 1000 ) )

+

+

+/**

+ * @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.

+ */

+#define mqttexampleCLIENT_IDENTIFIER	   mqttdemoprofileCLIENT_IDENTIFIER

+

+/**

+ * @brief Details of the MQTT broker to connect to.

+ */

+#define mqttexampleMQTT_BROKER_ENDPOINT	   mqttdemoprofileBROKER_ENDPOINT

+

+/**

+ * @brief The port to use for the demo.

+ */

+#define mqttexampleMQTT_BROKER_PORT		   mqttdemoprofileBROKER_PORT

+

+/**

+ * @brief The topic to subscribe and publish to in the example.

+ *

+ * The topic starts with the client identifier to ensure that each demo interacts

+ * with a unique topic.

+ */

+#define mqttexampleTOPIC				   mqttexampleCLIENT_IDENTIFIER "/example/topic"

+

+/**

+ * @brief The MQTT message published in this example.

+ */

+#define mqttexampleMESSAGE				   "Hello Light Weight MQTT World!"

+

+/**

+ * @brief Dimensions a file scope buffer currently used to send and receive MQTT data from a

+ * socket

+ */

+#define mqttexampleSHARED_BUFFER_SIZE	   500

+

+/*-----------------------------------------------------------*/

+

+/**

+ * @brief MQTT Protocol constants used by this demo.

+ * These types are defined in internal MQTT include files.

+ * For light-weight demo application, only a few are needed, therefore

+ * they are redefined here so that internal files need not be included.

+ */

+

+/*  MQTT Control Packet Types.*/

+#define MQTT_PACKET_TYPE_CONNACK	   ( ( uint8_t ) 0x20U ) /**< @brief CONNACK (server-to-client). */

+#define MQTT_PACKET_TYPE_PUBLISH	   ( ( uint8_t ) 0x30U ) /**< @brief PUBLISH (bi-directional). */

+#define MQTT_PACKET_TYPE_SUBACK		   ( ( uint8_t ) 0x90U ) /**< @brief SUBACK (server-to-client). */

+#define MQTT_PACKET_TYPE_UNSUBACK	   ( ( uint8_t ) 0xb0U ) /**< @brief UNSUBACK (server-to-client). */

+#define MQTT_PACKET_TYPE_PINGRESP	   ( ( uint8_t ) 0xd0U ) /**< @brief PINGRESP (server-to-client). */

+/* MQTT Fixed Packet Sizes */

+#define MQTT_PACKET_DISCONNECT_SIZE	   ( ( uint8_t ) 2 )     /**< @brief Size of DISCONNECT packet. */

+#define MQTT_PACKET_PINGREQ_SIZE	   ( ( uint8_t ) 2 )     /**< @brief Size of PINGREQ packet. */

+

+/*-----------------------------------------------------------*/

+

+/**

+ * @brief The task used to demonstrate the MQTT API.

+ *

+ * @param[in] pvParameters Parameters as passed at the time of task creation. Not

+ * used in this example.

+ */

+static void prvMQTTDemoTask( void * pvParameters );

+

+/**

+ * @brief Creates a TCP connection to the MQTT broker as specified in

+ * mqttexampleMQTT_BROKER_ENDPOINT and mqttexampleMQTT_BROKER_PORT.

+ *

+ * @return On success the socket connected to the MQTT broker is returned.  Otherwise

+ * FREERTOS_INVALID_SOCKET is returned.

+ *

+ */

+static Socket_t prvCreateTCPConnectionToBroker( void );

+

+/**

+ * @brief Sends an MQTT Connect packet over the already connected TCP socket.

+ *

+ * @param xMQTTSocketis a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return IOT_MQTT_SUCCESS is returned if the reply is a valid connection

+ * acknowledgeable (CONNACK) packet, otherwise an error code is returned.

+ */

+static IotMqttError_t prvCreateMQTTConnectionWithBroker( Socket_t xMQTTSocket );

+

+/**

+ * @brief Performs a graceful shutdown and close of the socket passed in as its

+ * parameter.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ */

+static void prvGracefulShutDown( Socket_t xSocket );

+

+/**

+ * @brief Subscribes to the topic as specified in mqttexampleTOPIC.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return IOT_MQTT_SUCCESS is returned if the

+ * subscription is successful, otherwise an error code is returned.

+ */

+static IotMqttError_t prvMQTTSubscribeToTopic( Socket_t xMQTTSocket );

+

+/**

+ * @brief  Publishes a messages mqttexampleMESSAGE on mqttexampleTOPIC topic.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return IOT_MQTT_SUCCESS is returned if Publish is successful,

+ * otherwise an error code is returned.

+ */

+static IotMqttError_t prvMQTTPublishToTopic( Socket_t xMQTTSocket );

+

+/**

+ * @brief  Process Incoming Publish.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return #IOT_MQTT_SUCCESS is returned if the processing is successful,

+ * otherwise an error code is returned.

+ */

+static IotMqttError_t prvMQTTProcessIncomingPublish( Socket_t xMQTTSocket );

+

+/**

+ * @brief Unsubscribes from the previously subscribed topic as specified

+ * in mqttexampleTOPIC.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return IOT_MQTT_SUCCESS is returned if the

+ * unsubscribe is successful, otherwise an error code is returned.

+ */

+static IotMqttError_t prvMQTTUnsubscribeFromTopic( Socket_t xMQTTSocket );

+

+/**

+ * @brief Send MQTT Ping Request to broker and receive response.

+ * Ping request is used to keep connection to broker alive.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return IOT_MQTT_SUCCESS is returned if the successful Ping Response is received.

+ * otherwise an error code is returned.

+ */

+static IotMqttError_t prvMQTTKeepAlive( Socket_t xMQTTSocket );

+

+/**

+ * @brief Disconnect From MQTT Broker.

+ *

+ * @param xMQTTSocket is a TCP socket that is connected to an MQTT broker to which

+ * an MQTT connection has been established.

+ *

+ * @return IOT_MQTT_SUCCESS is returned if the disconnect is successful,

+ * otherwise an error code is returned.

+ */

+static IotMqttError_t prvMQTTDisconnect( Socket_t xMQTTSocket );

+

+

+/*-----------------------------------------------------------*/

+

+/**

+ * @brief Function to receive next byte from network,

+ * The declaration must match IotMqttGetNextByte_t.

+ *

+ * @param[in] pvContext Network Connection context. Implementation in this

+ * file uses FreeRTOS socket.

+ * @param[in, out] pNextBye Pointer to buffer where the byte will be stored.

+ *

+ * @return #IOT_MQTT_SUCCESS or #IOT_MQTT_TIMEOUT

+ */

+

+IotMqttError_t getNextByte( void * pvContext,

+							uint8_t * pNextByte );

+

+/*-----------------------------------------------------------*/

+

+/* @brief Static memory buffer used for sending and receiving MQTT messages */

+static uint8_t ucSharedBuffer[ mqttexampleSHARED_BUFFER_SIZE ];

+

+/*-----------------------------------------------------------*/

+

+/*

+ * @brief Task for Light Weight MQTT Serializer API Proof of Concept.

+ * To run the proof of concept example, in main.c, in function vApplicationIPNetworkEventHook(),

+ * replace vStartSimpleMQTTDemo() with vApplicationIPNetworkEventHook().

+ */

+void vStartLightWeightMQTTDemo( void )

+{

+TickType_t xShortDelay = ( TickType_t ) pdMS_TO_TICKS( ( TickType_t ) 500 );

+

+	/* Wait a short time to allow receipt of the ARP replies. */

+	vTaskDelay( xShortDelay );

+

+	/* This example uses a single application task, which in turn is used to

+	 * connect, subscribe, publish, unsubscribe and disconnect from the MQTT

+	 * broker. */

+	xTaskCreate( prvMQTTDemoTask,          /* Function that implements the task. */

+				 "MQTTLWDemo",             /* 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. */

+}

+/*-----------------------------------------------------------*/

+

+static void prvGracefulShutDown( Socket_t xSocket )

+{

+uint8_t ucDummy[ 20 ];

+const TickType_t xShortDelay = pdMS_TO_MIN_TICKS( 250 );

+

+	if( xSocket != ( Socket_t ) 0 )

+	{

+		if( xSocket != FREERTOS_INVALID_SOCKET )

+		{

+			/* Initiate graceful shutdown. */

+			FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );

+

+			/* Wait for the socket to disconnect gracefully (indicated by FreeRTOS_recv()

+			 * returning a FREERTOS_EINVAL error) before closing the socket. */

+			while( FreeRTOS_recv( xSocket, ucDummy, sizeof( ucDummy ), 0 ) >= 0 )

+			{

+				/* Wait for shutdown to complete.  If a receive block time is used then

+				 * this delay will not be necessary as FreeRTOS_recv() will place the RTOS task

+				 * into the Blocked state anyway. */

+				vTaskDelay( xShortDelay );

+

+				/* Note ? real applications should implement a timeout here, not just

+				 * loop forever. */

+			}

+

+			/* The socket has shut down and is safe to close. */

+			FreeRTOS_closesocket( xSocket );

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+IotMqttError_t getNextByte( void * pvContext,

+							uint8_t * pNextByte )

+{

+Socket_t xMQTTSocket = ( Socket_t ) pvContext;

+BaseType_t receivedBytes;

+IotMqttError_t result;

+

+	/* Receive one byte from network */

+	receivedBytes = FreeRTOS_recv( xMQTTSocket, ( void * ) pNextByte, sizeof( uint8_t ), 0 );

+

+	if( receivedBytes == sizeof( uint8_t ) )

+	{

+		result = IOT_MQTT_SUCCESS;

+	}

+	else

+	{

+		result = IOT_MQTT_TIMEOUT;

+	}

+

+	return result;

+}

+

+/*-----------------------------------------------------------*/

+

+static void prvMQTTDemoTask( void * pvParameters )

+{

+const TickType_t xNoDelay = ( TickType_t ) 0;

+Socket_t xMQTTSocket;

+IotMqttError_t xReturned;

+uint32_t ulPublishCount = 0;

+const uint32_t ulMaxPublishCount = 5UL;

+

+	/* Remove compiler warnings about unused parameters. */

+	( void ) pvParameters;

+

+	for( ; ; )

+	{

+		/* Don't expect any notifications to be pending yet. */

+		configASSERT( ulTaskNotifyTake( pdTRUE, xNoDelay ) == 0 );

+

+		/****************************** Connect. ******************************/

+

+		/* Establish a TCP connection with the MQTT broker. This example connects to

+		 * the MQTT broker as specified in mqttexampleMQTT_BROKER_ENDPOINT and

+		 * mqttexampleMQTT_BROKER_PORT at the top of this file. */

+		configPRINTF( ( "Create a TCP connection to %s\r\n", mqttexampleMQTT_BROKER_ENDPOINT ) );

+		xMQTTSocket = prvCreateTCPConnectionToBroker();

+		configASSERT( xMQTTSocket != FREERTOS_INVALID_SOCKET );

+		configPRINTF( ( "Connected to %s\r\n", mqttexampleMQTT_BROKER_ENDPOINT ) );

+

+		/* Sends an MQTT Connect packet over the already connected TCP socket

+		 * xMQTTSocket, then waits for and interprets the reply. IOT_MQTT_SUCCESS is

+		 * returned if the reply is a valid connection acknowledgeable (CONNACK) packet,

+		 * otherwise an error code is returned. */

+		configPRINTF( ( "Creating an MQTT connection with %s\r\n", mqttexampleMQTT_BROKER_ENDPOINT ) );

+		xReturned = prvCreateMQTTConnectionWithBroker( xMQTTSocket );

+		configASSERT( xReturned == IOT_MQTT_SUCCESS );

+		configPRINTF( ( "Established an MQTT connection.\r\n" ) );

+

+		/**************************** Subscribe. ******************************/

+

+		/* The client is now connected to the broker. Subscribe to the topic

+		 * as specified in mqttexampleTOPIC at the top of this file by sending a

+		 * subscribe packet then waiting for a subscribe acknowledgment (SUBACK).

+		 * This client will then publish to the same topic it subscribed to, so will

+		 * expect all the messages it sends to the broker to be sent back to it

+		 * from the broker. */

+		configPRINTF( ( "Attempt to subscribed to the MQTT topic %s\r\n", mqttexampleTOPIC ) );

+		xReturned = prvMQTTSubscribeToTopic( xMQTTSocket );

+		configPRINTF( ( "Subscribed to the topic %s\r\n", mqttexampleTOPIC ) );

+

+		/**************************** Publish. ******************************/

+		/* Send publish for with QOS0, Process Keep alive */

+		for( ulPublishCount = 0; ulPublishCount < ulMaxPublishCount; ulPublishCount++ )

+		{

+			configPRINTF( ( "Attempt to publish to the MQTT topic %s\r\n", mqttexampleTOPIC ) );

+			xReturned = prvMQTTPublishToTopic( xMQTTSocket );

+			configASSERT( xReturned == IOT_MQTT_SUCCESS );

+			configPRINTF( ( "Publish successful to the topic %s\r\n", mqttexampleTOPIC ) );

+

+			/* Process incoming publish echo, since application subscribed to the same topic

+			 * broker will send publish message back to the application */

+			configPRINTF( ( "Attempt to receive publish message from broker\r\n" ) );

+			xReturned = prvMQTTProcessIncomingPublish( xMQTTSocket );

+			configASSERT( xReturned == IOT_MQTT_SUCCESS );

+			configPRINTF( ( "Successfully Received Publish message from broker\r\n" ) );

+

+			/* Leave Connection Idle for some time */

+			configPRINTF( ( "Keeping Connection Idle\r\n" ) );

+			vTaskDelay( pdMS_TO_TICKS( mqttexampleKEEP_ALIVE_DELAY ) );

+			/* Send Ping request to broker and receive ping response */

+			configPRINTF( ( "Sending Ping Request to the broker\r\n" ) );

+			xReturned = prvMQTTKeepAlive( xMQTTSocket );

+			configASSERT( xReturned == IOT_MQTT_SUCCESS );

+			configPRINTF( ( "Ping Response successfully received\r\n" ) );

+		}

+

+		/************************ Unsubscribe from the topic. **************************/

+		configPRINTF( ( "Attempt to unsubscribe from the MQTT topic %s\r\n", mqttexampleTOPIC ) );

+		xReturned = prvMQTTUnsubscribeFromTopic( xMQTTSocket );

+		configASSERT( xReturned == IOT_MQTT_SUCCESS );

+		configPRINTF( ( "Unsubscribe from the topic %s\r\n", mqttexampleTOPIC ) );

+

+		/**************************** Disconnect. ******************************/

+

+		/* Sends an MQTT Disconnect packet over the already connected TCP socket

+		 * xMQTTSocket, then waits for and interprets the reply.  IOT_MQTT_SUCCESS is

+		 * returned if the reply is a valid connection acknowledgeable (CONNACK) packet,

+		 * otherwise an error code is returned. */

+

+		configPRINTF( ( "Creating an MQTT connection with %s\r\n", mqttexampleMQTT_BROKER_ENDPOINT ) );

+		xReturned = prvMQTTDisconnect( xMQTTSocket );

+		configASSERT( xReturned == IOT_MQTT_SUCCESS );

+		configPRINTF( ( "Established an MQTT connection.\r\n" ) );

+		/* Disconnect from broker. */

+		prvGracefulShutDown( xMQTTSocket );

+

+		/* Wait for some time between two iterations to ensure that we do not

+		 * bombard the public test mosquitto broker. */

+		configPRINTF( ( "prvMQTTDemoTask() completed an iteration successfully. Total free heap is %u\r\n", xPortGetFreeHeapSize() ) );

+		configPRINTF( ( "Short delay before starting the next iteration.... \r\n\r\n" ) );

+		vTaskDelay( pdMS_TO_TICKS( mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS ) );

+	}

+}

+/*-----------------------------------------------------------*/

+

+Socket_t prvCreateTCPConnectionToBroker( void )

+{

+Socket_t xMQTTSocket;

+	struct freertos_sockaddr xBrokerAddress;

+	uint32_t ulBrokerIPAddress;

+

+	/* This is the socket used to connect to the MQTT broker. */

+	xMQTTSocket = FreeRTOS_socket( FREERTOS_AF_INET,

+								   FREERTOS_SOCK_STREAM,

+								   FREERTOS_IPPROTO_TCP );

+

+	configASSERT( xMQTTSocket != FREERTOS_INVALID_SOCKET );

+

+	/* Locate then connect to the MQTT broker. */

+	ulBrokerIPAddress = FreeRTOS_gethostbyname( mqttexampleMQTT_BROKER_ENDPOINT );

+

+	if( ulBrokerIPAddress != 0 )

+	{

+		xBrokerAddress.sin_port = FreeRTOS_htons( mqttexampleMQTT_BROKER_PORT );

+		xBrokerAddress.sin_addr = ulBrokerIPAddress;

+

+		if( FreeRTOS_connect( xMQTTSocket, &xBrokerAddress, sizeof( xBrokerAddress ) ) != 0 )

+		{

+			/* Could not connect so delete socket and return an error. */

+			FreeRTOS_closesocket( xMQTTSocket );

+			xMQTTSocket = FREERTOS_INVALID_SOCKET;

+		}

+	}

+

+	return xMQTTSocket;

+}

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvCreateMQTTConnectionWithBroker( Socket_t xMQTTSocket )

+{

+IotMqttConnectInfo_t xConnectInfo;

+size_t xRemainingLength = 0;

+size_t xPacketSize = 0;

+IotMqttError_t xResult;

+IotMqttPacketInfo_t xIncomingPacket;

+

+	/* Many fields not used in this demo so start with everything at 0. */

+	memset( ( void * ) &xConnectInfo, 0x00, sizeof( xConnectInfo ) );

+	memset( ( void * ) &xIncomingPacket, 0x00, sizeof( xIncomingPacket ) );

+

+	/* Start with a clean session i.e. direct the MQTT broker to discard any

+	 * previous session data. Also, establishing a connection with clean session

+	 * will ensure that the broker does not store any data when this client

+	 * gets disconnected. */

+	xConnectInfo.cleanSession = true;

+

+	/* The client identifier is used to uniquely identify this MQTT client to

+	 * the MQTT broker.  In a production device the identifier can be something

+	 * unique, such as a device serial number. */

+	xConnectInfo.pClientIdentifier = mqttexampleCLIENT_IDENTIFIER;

+	xConnectInfo.clientIdentifierLength = ( uint16_t ) strlen( mqttexampleCLIENT_IDENTIFIER );

+

+	/* Get size requirement for the connect packet */

+	xResult = IotMqtt_GetConnectPacketSize( &xConnectInfo, &xRemainingLength, &xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+	/* Make sure the packet size is less than static buffer size */

+	configASSERT( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );

+	/* Serialize MQTT connect packet into provided buffer */

+	xResult = IotMqtt_SerializeConnect( &xConnectInfo, xRemainingLength, ucSharedBuffer, xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+

+	if( FreeRTOS_send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 ) == ( BaseType_t ) xPacketSize )

+	{

+		/* Wait for the connection ack. TODO check the receive timeout value. */

+

+		memset( ( void * ) &xIncomingPacket, 0x00, sizeof( IotMqttPacketInfo_t ) );

+

+		/* Get packet type and remaining length of the received packet

+		 * We cannot assume received data is the connection acknowledgment.

+		 * Therefore this function reads type and remaining length of the

+		 * received packet, before processing entire packet.

+		 */

+		xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );

+		configASSERT( xResult == IOT_MQTT_SUCCESS );

+		configASSERT( xIncomingPacket.type == MQTT_PACKET_TYPE_CONNACK );

+		configASSERT( xIncomingPacket.remainingLength <= mqttexampleSHARED_BUFFER_SIZE );

+

+		if( FreeRTOS_recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 )

+			== ( BaseType_t ) xIncomingPacket.remainingLength )

+		{

+			xIncomingPacket.pRemainingData = ucSharedBuffer;

+

+			if( IotMqtt_DeserializeResponse( &xIncomingPacket ) != IOT_MQTT_SUCCESS )

+			{

+				xResult = IOT_MQTT_SERVER_REFUSED;

+			}

+		}

+		else

+		{

+			configPRINTF( ( "Receive Failed while receiving MQTT ConnAck\n" ) );

+			xResult = IOT_MQTT_NETWORK_ERROR;

+		}

+	}

+	else

+	{

+		configPRINTF( ( "Send Failed while connecting to MQTT broker\n" ) );

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+

+	return xResult;

+}

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvMQTTSubscribeToTopic( Socket_t xMQTTSocket )

+{

+IotMqttError_t xResult;

+IotMqttSubscription_t xMQTTSubscription[ 1 ];

+size_t xRemainingLength = 0;

+size_t xPacketSize = 0;

+uint16_t usPacketIdentifier;

+IotMqttPacketInfo_t xIncomingPacket;

+

+	/* Some fields not used by this demo so start with everything at 0. */

+	memset( ( void * ) &xMQTTSubscription, 0x00, sizeof( xMQTTSubscription ) );

+

+	/* Subscribe to the mqttexampleTOPIC topic filter. This example subscribes to only one topic */

+	xMQTTSubscription[ 0 ].qos = IOT_MQTT_QOS_0;

+	xMQTTSubscription[ 0 ].pTopicFilter = mqttexampleTOPIC;

+	xMQTTSubscription[ 0 ].topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC );

+

+	xResult = IotMqtt_GetSubscriptionPacketSize( IOT_MQTT_SUBSCRIBE,

+												 xMQTTSubscription,

+												 sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),

+												 &xRemainingLength, &xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+	/* Make sure the packet size is less than static buffer size */

+	configASSERT( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );

+

+	/* Serialize subscribe into statically allocated ucSharedBuffer */

+	xResult = IotMqtt_SerializeSubscribe( xMQTTSubscription,

+										  sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),

+										  xRemainingLength,

+										  &usPacketIdentifier,

+										  ucSharedBuffer,

+										  xPacketSize );

+

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+

+	if( FreeRTOS_send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 ) == ( BaseType_t ) xPacketSize )

+	{

+		/* Wait for the subscription ack. The socket is already connected to the MQTT broker, so

+		 * publishes to this client can occur at any time and we cannot assume received

+		 * data is the subscription acknowledgment.  Therefore this function is, at this

+		 * time, doing what would otherwise be done wherever incoming packets are

+		 * interpreted (in a callback, or whatever). */

+		memset( ( void * ) &xIncomingPacket, 0x00, sizeof( IotMqttPacketInfo_t ) );

+		xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );

+		configASSERT( xResult == IOT_MQTT_SUCCESS );

+		configASSERT( xIncomingPacket.type == MQTT_PACKET_TYPE_SUBACK );

+		configASSERT( xIncomingPacket.remainingLength <= mqttexampleSHARED_BUFFER_SIZE );

+

+		/* Receive the remaining bytes. */

+		if( FreeRTOS_recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 ) == ( BaseType_t ) xIncomingPacket.remainingLength )

+		{

+			xIncomingPacket.pRemainingData = ucSharedBuffer;

+

+			if( IotMqtt_DeserializeResponse( &xIncomingPacket ) != IOT_MQTT_SUCCESS )

+			{

+				xResult = IOT_MQTT_BAD_RESPONSE;

+			}

+		}

+		else

+		{

+			xResult = IOT_MQTT_NETWORK_ERROR;

+		}

+	}

+	else

+	{

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+

+	return xResult;

+}

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvMQTTPublishToTopic( Socket_t xMQTTSocket )

+{

+IotMqttError_t xResult;

+IotMqttPublishInfo_t xMQTTPublishInfo;

+size_t xRemainingLength = 0;

+size_t xPacketSize = 0;

+uint16_t usPacketIdentifier;

+uint8_t * pusPacketIdentifierHigh;

+

+	/* Some fields not used by this demo so start with everything at 0. */

+	memset( ( void * ) &xMQTTPublishInfo, 0x00, sizeof( xMQTTPublishInfo ) );

+	xMQTTPublishInfo.qos = IOT_MQTT_QOS_0;

+	xMQTTPublishInfo.retain = false;

+	xMQTTPublishInfo.pTopicName = mqttexampleTOPIC;

+	xMQTTPublishInfo.topicNameLength = ( uint16_t ) strlen( mqttexampleTOPIC );

+	xMQTTPublishInfo.pPayload = mqttexampleMESSAGE;

+	xMQTTPublishInfo.payloadLength = strlen( mqttexampleMESSAGE );

+

+	/* Find out length of Publish packet size. */

+	xResult = IotMqtt_GetPublishPacketSize( &xMQTTPublishInfo, &xRemainingLength, &xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+	/* Make sure the packet size is less than static buffer size */

+	configASSERT( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );

+

+	xResult = IotMqtt_SerializePublish( &xMQTTPublishInfo,

+										xRemainingLength,

+										&usPacketIdentifier,

+										&pusPacketIdentifierHigh,

+										ucSharedBuffer,

+										xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+

+	if( FreeRTOS_send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 ) != ( BaseType_t ) xPacketSize )

+	{

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+	else

+	{

+		/* Send success. Since in this case, we are using IOT_MQTT_QOS_0,

+		 * there will not be any PubAck. Publish will be echoed back, which is processed

+		 * in prvMQTTProcessIncomingPublish() */

+		xResult = IOT_MQTT_SUCCESS;

+	}

+

+	return xResult;

+}

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvMQTTProcessIncomingPublish( Socket_t xMQTTSocket )

+{

+IotMqttError_t xResult;

+IotMqttPacketInfo_t xIncomingPacket;

+

+	memset( ( void * ) &xIncomingPacket, 0x00, sizeof( IotMqttPacketInfo_t ) );

+	xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+	configASSERT( ( xIncomingPacket.type & 0xf0 ) == MQTT_PACKET_TYPE_PUBLISH );

+	configASSERT( xIncomingPacket.remainingLength <= mqttexampleSHARED_BUFFER_SIZE );

+

+	/* Receive the remaining bytes. */

+	if( FreeRTOS_recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 ) == ( BaseType_t ) xIncomingPacket.remainingLength )

+	{

+		xIncomingPacket.pRemainingData = ucSharedBuffer;

+

+		if( IotMqtt_DeserializePublish( &xIncomingPacket ) != IOT_MQTT_SUCCESS )

+		{

+			xResult = IOT_MQTT_BAD_RESPONSE;

+		}

+		else

+		{

+			/* Process incoming Publish */

+			configPRINTF( ( "Incoming QOS : %d\n", xIncomingPacket.pubInfo.qos ) );

+			configPRINTF( ( "Incoming Publish Topic Name: %.*s\n", xIncomingPacket.pubInfo.topicNameLength, xIncomingPacket.pubInfo.pTopicName ) );

+			configPRINTF( ( "Incoming Publish Message : %.*s\n", xIncomingPacket.pubInfo.payloadLength, xIncomingPacket.pubInfo.pPayload ) );

+		}

+	}

+	else

+	{

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+

+	return xResult;

+}

+

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvMQTTUnsubscribeFromTopic( Socket_t xMQTTSocket )

+{

+IotMqttError_t xResult;

+IotMqttSubscription_t xMQTTSubscription[ 1 ];

+size_t xRemainingLength;

+size_t xPacketSize;

+uint16_t usPacketIdentifier;

+IotMqttPacketInfo_t xIncomingPacket;

+

+	/* Some fields not used by this demo so start with everything at 0. */

+	memset( ( void * ) &xMQTTSubscription, 0x00, sizeof( xMQTTSubscription ) );

+

+	/* Unsubscribe to the mqttexampleTOPIC topic filter. The task handle is passed

+	 * as the callback context which is used by the callback to send a task

+	 * notification to this task.*/

+	xMQTTSubscription[ 0 ].qos = IOT_MQTT_QOS_0;

+	xMQTTSubscription[ 0 ].pTopicFilter = mqttexampleTOPIC;

+	xMQTTSubscription[ 0 ].topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC );

+

+	xResult = IotMqtt_GetSubscriptionPacketSize( IOT_MQTT_UNSUBSCRIBE,

+												 xMQTTSubscription,

+												 sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),

+												 &xRemainingLength,

+												 &xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+	/* Make sure the packet size is less than static buffer size */

+	configASSERT( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );

+

+	xResult = IotMqtt_SerializeUnsubscribe( xMQTTSubscription,

+											sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),

+											xRemainingLength,

+											&usPacketIdentifier,

+											ucSharedBuffer,

+											xPacketSize );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+

+	if( FreeRTOS_send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 ) == ( BaseType_t ) xPacketSize )

+	{

+		/* Wait for the subscription ack. The socket is already connected to the MQTT broker, so

+		 * publishes to this client can occur at any time and we cannot assume received

+		 * data is the subscription acknowledgment.  Therefore this function is, at this

+		 * time, doing what would otherwise be done wherever incoming packets are

+		 * interpreted (in a callback, or whatever). */

+		memset( ( void * ) &xIncomingPacket, 0x00, sizeof( IotMqttPacketInfo_t ) );

+		xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );

+		configASSERT( xResult == IOT_MQTT_SUCCESS );

+		configASSERT( xIncomingPacket.type == MQTT_PACKET_TYPE_UNSUBACK );

+		configASSERT( xIncomingPacket.remainingLength <= sizeof( ucSharedBuffer ) );

+

+		/* Receive the remaining bytes. */

+		if( FreeRTOS_recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 ) == ( BaseType_t ) xIncomingPacket.remainingLength )

+		{

+			xIncomingPacket.pRemainingData = ucSharedBuffer;

+

+			if( IotMqtt_DeserializeResponse( &xIncomingPacket ) != IOT_MQTT_SUCCESS )

+			{

+				xResult = IOT_MQTT_BAD_RESPONSE;

+			}

+		}

+		else

+		{

+			xResult = IOT_MQTT_NETWORK_ERROR;

+		}

+	}

+	else

+	{

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+

+	return xResult;

+}

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvMQTTKeepAlive( Socket_t xMQTTSocket )

+{

+IotMqttError_t xResult;

+IotMqttPacketInfo_t xIncomingPacket;

+

+	/* PingReq is fixed length packet, therefore there is no need to calculate the size,

+	 * just makes sure static buffer can accommodate ping request */

+

+	configASSERT( MQTT_PACKET_PINGREQ_SIZE <= mqttexampleSHARED_BUFFER_SIZE );

+

+	xResult = IotMqtt_SerializePingreq( ucSharedBuffer, MQTT_PACKET_PINGREQ_SIZE );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+

+	if( FreeRTOS_send( xMQTTSocket, ( void * ) ucSharedBuffer, MQTT_PACKET_PINGREQ_SIZE, 0 ) == ( BaseType_t ) MQTT_PACKET_PINGREQ_SIZE )

+	{

+		memset( ( void * ) &xIncomingPacket, 0x00, sizeof( IotMqttPacketInfo_t ) );

+		xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );

+		configASSERT( xResult == IOT_MQTT_SUCCESS );

+		configASSERT( xIncomingPacket.type == MQTT_PACKET_TYPE_PINGRESP );

+		configASSERT( xIncomingPacket.remainingLength <= sizeof( ucSharedBuffer ) );

+

+		/* Receive the remaining bytes. */

+		if( FreeRTOS_recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 )

+			== ( BaseType_t ) xIncomingPacket.remainingLength )

+		{

+			xIncomingPacket.pRemainingData = ucSharedBuffer;

+

+			if( IotMqtt_DeserializeResponse( &xIncomingPacket ) != IOT_MQTT_SUCCESS )

+			{

+				xResult = IOT_MQTT_BAD_RESPONSE;

+			}

+		}

+		else

+		{

+			xResult = IOT_MQTT_NETWORK_ERROR;

+		}

+	}

+	else

+	{

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+

+	return xResult;

+}

+

+/*-----------------------------------------------------------*/

+

+static IotMqttError_t prvMQTTDisconnect( Socket_t xMQTTSocket )

+{

+IotMqttError_t xResult;

+

+	/* Disconnect is fixed length packet, therefore there is no need to calculate the size,

+	 * just makes sure static buffer can accommodate disconnect request */

+

+	configASSERT( MQTT_PACKET_DISCONNECT_SIZE <= mqttexampleSHARED_BUFFER_SIZE );

+

+	xResult = IotMqtt_SerializeDisconnect( ucSharedBuffer, MQTT_PACKET_DISCONNECT_SIZE );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+

+	if( FreeRTOS_send( xMQTTSocket, ( void * ) ucSharedBuffer, MQTT_PACKET_DISCONNECT_SIZE, 0 ) == ( BaseType_t ) MQTT_PACKET_DISCONNECT_SIZE )

+	{

+		xResult = IOT_MQTT_SUCCESS;

+	}

+	else

+	{

+		xResult = IOT_MQTT_NETWORK_ERROR;

+	}

+

+	return xResult;

+}

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/DemoTasks/SimpleMQTTExamples.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/DemoTasks/SimpleMQTTExamples.c
new file mode 100644
index 0000000..feb872c
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/DemoTasks/SimpleMQTTExamples.c
@@ -0,0 +1,659 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/*

+ * This file contains the common functions for plain text, basic TLS, and mutual

+ * authentication MQTT demos. Aside from the difference in security level during

+ * connect, the three demos perform the same interaction with a MQTT broker. The

+ * demos create a single application task that connects to a MQTT broker,

+ * subscribes to a topic, publishes a topic with a message, and disconnect from a

+ * MQTT broker. The task subscribes to the same topic it publishes to, receiving

+ * the message it sends to the broker. Note that this demo does not terminate, the

+ * connect-subscribe-publish-disconnect cycle is repeated for unlimited number of

+ * times.

+ *

+ * The plain text MQTT demo does not authenticate the server nor the client. The

+ * basic TLS MQTT demo builds on top of the plain text demo, adding broker

+ * authentication and encryption. The mutual authentication MQTT demo builds on top

+ * of the basic TLS demo, enabling both server and client authentication.

+ *

+ * For more information regarding the MQTT library and the demo, please refer to:

+ * https://freertos.org/mqtt/index.html

+ */

+

+/* Standard includes. */

+#include <string.h>

+#include <stdio.h>

+

+/* Kernel includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* FreeRTOS+TCP includes. */

+#include "FreeRTOS_IP.h"

+

+/* IoT SDK includes. */

+#include "iot_mqtt.h"

+#include "iot_taskpool_freertos.h"

+#include "platform/iot_network_freertos.h"

+

+/* MQTT Demo Select */

+#include "demo_config.h"

+

+/* Select MQTT profile based on the setting in demo_config.h */

+#if ( democonfigPROFILE_USE_AWS_IOT == 1 )

+	#include "aws_iot_demo_profile.h"

+#else

+	#include "mqtt_demo_profile.h"

+#endif

+

+/* Preprocessor check for configuration */

+#include "aws_iot_setup_check.h"

+

+/*

+ * Set connection profile based on the setting in demo_config.h. For more

+ * information on each variable, please refer to the respective *_profile.h

+ * file in FreeRTOS-Labs\Demo\FreeRTOS_IoT_Libraries\include.

+ *

+ * Note that if you are running mqtt_tls_mutual_auth demo please make sure to

+ * visit the following link for setup:

+ * https://www.freertos.org/mqtt/preconfiguredexamplesMA.html

+ */

+#if ( democonfigPROFILE_USE_AWS_IOT == 1 )

+	#define mqttexampleBROKER_ENDPOINT			 awsiotdemoprofileAWS_ENDPOINT

+	#define mqttexampleBROKER_PORT				 awsiotdemoprofileAWS_MQTT_PORT

+	#define mqttexampleBROKER_CERTIFICATE_PEM	 awsiotdemoprofileAWS_CERTIFICATE_PEM

+	#define mqttexampleCLIENT_IDENTIFIER		 awsiotdemoprofileCLIENT_IDENTIFIER

+	#define mqttexampleCLIENT_CERTIFICATE_PEM	 awsiotdemoprofileCLIENT_CERTIFICATE_PEM

+	#define mqttexampleCLIENT_PRIVATE_KEY_PEM	 awsiotdemoprofileCLIENT_PRIVATE_KEY_PEM

+#else

+	#define mqttexampleBROKER_ENDPOINT			 mqttdemoprofileBROKER_ENDPOINT

+	#define mqttexampleBROKER_PORT				 mqttdemoprofileBROKER_PORT

+	#define mqttexampleBROKER_CERTIFICATE_PEM	 mqttdemoprofileBROKER_CERTIFICATE_PEM

+	#define mqttexampleCLIENT_IDENTIFIER		 mqttdemoprofileCLIENT_IDENTIFIER

+#endif /* if ( democonfigPROFILE_USE_AWS_IOT == pdTRUE ) */

+

+/**

+ * @brief The keep-alive interval used for this example.

+ *

+ * An MQTT ping request will be sent periodically at this interval.

+ *

+ * @note: This value is set to zero to disable MQTT

+ * keep alive for the Windows simulator project.

+ * The FreeRTOS kernel does not accurately calculate time for the Windows

+ * Simulator. Therefore, MQTT PING Request messages may be sent

+ * at an incorrect time interval to the broker. If the broker does

+ * not receive a ping request within 1.5x the time sent in a

+ * connection request, the broker may close the connection.

+ * To enable the keep alive feature, set this value

+ * to the desired interval in seconds.

+ */

+#define mqttexampleKEEP_ALIVE_SECONDS	   ( 0 )

+

+/**

+ * @brief The timeout for MQTT operations in this example.

+ */

+#define mqttexampleMQTT_TIMEOUT_MS		   ( 5000 )

+

+/**

+ * @brief The topic to subscribe and publish to in the example.

+ *

+ * The topic starts with the client identifier to ensure that each demo interacts

+ * with a unique topic.

+ */

+#define mqttexampleTOPIC				   mqttexampleCLIENT_IDENTIFIER "/example/topic"

+

+/**

+ * @brief The MQTT message published in this example.

+ */

+#define mqttexampleMESSAGE				   "Hello World!"

+

+/**

+ * @brief Parameters to control the retry behavior in case a QoS1 publish

+ * message gets lost.

+ *

+ * Retry every minutes up to a maximum of 5 retries.

+ */

+#define mqttexamplePUBLISH_RETRY_MS		   ( 1000 )

+#define mqttexamplePUBLISH_RETRY_LIMIT	   ( 5 )

+

+/**

+ * @brief The bit which is set in the demo task's notification value from the

+ * disconnect callback to inform the demo task about the MQTT disconnect.

+ */

+#define mqttexampleDISCONNECTED_BIT		   ( 1UL << 0UL )

+

+/**

+ * @brief The bit which is set in the demo task's notification value from the

+ * publish callback to inform the demo task about the message received from the

+ * MQTT broker.

+ */

+#define mqttexampleMESSAGE_RECEIVED_BIT	   ( 1UL << 1UL )

+

+/*-----------------------------------------------------------*/

+

+/**

+ * @brief The task used to demonstrate the MQTT API.

+ *

+ * @param[in] pvParameters Parameters as passed at the time of task creation. Not

+ * used in this example.

+ */

+static void prvMQTTDemoTask( void * pvParameters );

+

+/**

+ * @brief The callback invoked by the MQTT library when the MQTT connection gets

+ * disconnected.

+ *

+ * @param[in] pvCallbackContext Callback context as provided at the time of

+ * connect.

+ * @param[in] pxCallbackParams Contains the reason why the MQTT connection was

+ * disconnected.

+ */

+static void prvExample_OnDisconnect( void * pvCallbackContext,

+									 IotMqttCallbackParam_t * pxCallbackParams );

+

+/**

+ * @brief The callback invoked by the MQTT library when a message is received on

+ * a subscribed topic from the MQTT broker.

+ *

+ * @param[in] pvCallbackContext Callback context as provided at the time of

+ * subscribe.

+ * @param[in] pxCallbackParams Contain the details about the received message -

+ * topic on which the message was received, the received message.

+ */

+static void prvExample_OnMessageReceived( void * pvCallbackContext,

+										  IotMqttCallbackParam_t * pxCallbackParams );

+

+/**

+ * @brief Connects to the MQTT broker as specified in mqttexampleBROKER_ENDPOINT

+ * and mqttexampleBROKER_PORT.

+ */

+static void prvMQTTConnect( void );

+

+/**

+ * @brief Subscribes to the topic as specified in mqttexampleTOPIC.

+ */

+static void prvMQTTSubscribe( void );

+

+/**

+ * @brief Publishes a messages mqttexampleMESSAGE on mqttexampleTOPIC topic.

+ */

+static void prvMQTTPublish( void );

+

+/**

+ * @brief Unsubscribes from the mqttexampleTOPIC topic.

+ */

+static void prvMQTTUnsubscribe( void );

+

+/**

+ * @brief Disconnects from the MQTT broker gracefully by sending an MQTT

+ * DISCONNECT message.

+ */

+static void prvMQTTDisconnect( void );

+

+/**

+* @brief Initializes the IoT libraries used by this demo.

+*/

+static void prvInitialiseLibraries( void );

+

+/**

+ * @brief The MQTT connection handle used in this example.

+ */

+static IotMqttConnection_t xMQTTConnection = IOT_MQTT_CONNECTION_INITIALIZER;

+

+/*-----------------------------------------------------------*/

+

+/**

+ * @brief Parameters used to create the system task pool.

+ */

+static const IotTaskPoolInfo_t xTaskPoolParameters =

+{

+	/* Minimum number of threads in a task pool.

+	 * Note the slimmed down version of the task

+	 * pool used by this library does not auto-scale

+	 * the number of tasks in the pool so in this

+	 * case this sets the number of tasks in the

+	 * pool. */

+	1,

+

+	/* Maximum number of threads in a task pool.

+	 * Note the slimmed down version of the task

+	 * pool used by this library does not auto-scale

+	 * the number of tasks in the pool so in this

+	 * case this parameter is just ignored. */

+	1,

+

+	/* Stack size for every task pool thread - in

+	 * bytes, hence multiplying by the number of bytes

+	 * in a word as configMINIMAL_STACK_SIZE is

+	 * specified in words. */

+	configMINIMAL_STACK_SIZE * sizeof( portSTACK_TYPE ),

+	/* Priority for every task pool thread. */

+	tskIDLE_PRIORITY,

+};

+

+/*-----------------------------------------------------------*/

+

+static const struct IotNetworkServerInfo xMQTTBrokerInfo =

+{

+	.pHostName = mqttexampleBROKER_ENDPOINT,

+	.port = mqttexampleBROKER_PORT

+};

+

+#if ( democonfigENABLE_TLS )

+	static struct IotNetworkCredentials xNetworkSecurityCredentials =

+	{

+		/* Optional TLS extensions. For this demo, they are disabled. */

+		.pAlpnProtos = NULL,

+		.maxFragmentLength = 0,

+

+		/* SNI is enabled by default. */

+		.disableSni = false,

+

+		/* Provide the certificate for validating the server. Only required for

+		 * demos using TLS. */

+		.pRootCa = mqttexampleBROKER_CERTIFICATE_PEM,

+		.rootCaSize = sizeof( mqttexampleBROKER_CERTIFICATE_PEM ),

+

+		/* Strong mutual authentication to authenticate both the broker and

+		 * the client. */

+		#if ( democonfigENABLE_MUTUAL_AUTH )

+			.pClientCert = mqttexampleCLIENT_CERTIFICATE_PEM,

+			.clientCertSize = sizeof( mqttexampleCLIENT_CERTIFICATE_PEM ),

+			.pPrivateKey = mqttexampleCLIENT_PRIVATE_KEY_PEM,

+			.privateKeySize = sizeof( mqttexampleCLIENT_PRIVATE_KEY_PEM )

+		#else

+			.pClientCert = NULL,

+			.clientCertSize = 0,

+			.pPrivateKey = NULL,

+			.privateKeySize = 0

+		#endif /* if ( democonfigENABLE_MUTUAL_AUTH ) */

+	};

+#endif /* if ( democonfigENABLE_TLS ) */

+

+static IotMqttNetworkInfo_t xNetworkInfo =

+{

+	/* No connection to the MQTT broker has been established yet and we want to

+	 * establish a new connection. */

+	.createNetworkConnection = true,

+	.u.setup.pNetworkServerInfo = &( xMQTTBrokerInfo ),

+

+	/* Set the TLS credentials for the new MQTT connection. This member is NULL

+	 * for the plain text MQTT demo. */

+	#if ( democonfigENABLE_TLS )

+		.u.setup.pNetworkCredentialInfo = &xNetworkSecurityCredentials,

+	#else

+		.u.setup.pNetworkCredentialInfo = NULL, /* Not using TLS so no credentials. */

+	#endif

+

+	/* Use FreeRTOS+TCP network interface. */

+	.pNetworkInterface = IOT_NETWORK_INTERFACE_FREERTOS,

+

+	/* Setup the callback which is called when the MQTT connection is

+	 * disconnected. The task handle is passed as the callback context which

+	 * is used by the callback to send a task notification to this task.*/

+	.disconnectCallback.function = prvExample_OnDisconnect

+};

+

+static const IotMqttConnectInfo_t xConnectInfo =

+{

+	/* Set this flag to true if connecting to the AWS IoT MQTT broker. */

+	#if ( democonfigPROFILE_USE_AWS_IOT == 1 )

+		.awsIotMqttMode = true,

+	#else

+		.awsIotMqttMode = false,

+	#endif

+

+	/* Start with a clean session i.e. direct the MQTT broker to discard any

+	 * previous session data. Also, establishing a connection with clean session

+	 * will ensure that the broker does not store any data when this client

+	 * gets disconnected. */

+	.cleanSession = true,

+

+	/* Since we are starting with a clean session, there are no previous

+	 * subscriptions to be restored. */

+	.pPreviousSubscriptions = NULL,

+	.previousSubscriptionCount = 0,

+

+	/* We do not want to publish Last Will and Testament (LWT) message if the

+	 * client gets disconnected. */

+	.pWillInfo = NULL,

+

+	/* Send an MQTT PING request every minute to keep the connection open if

+	there is no other MQTT traffic. */

+	.keepAliveSeconds = mqttexampleKEEP_ALIVE_SECONDS,

+

+	/* The client identifier is used to uniquely identify this MQTT client to

+	 * the MQTT broker.  In a production device the identifier can be something

+	 * unique, such as a device serial number. */

+	.pClientIdentifier = mqttexampleCLIENT_IDENTIFIER,

+	.clientIdentifierLength = ( uint16_t ) sizeof( mqttexampleCLIENT_IDENTIFIER ) - 1,

+

+	/* This example does not authenticate the client and therefore username and

+	 * password fields are not used. */

+	.pUserName = NULL,

+	.userNameLength = 0,

+	.pPassword = NULL,

+	.passwordLength = 0

+};

+/*-----------------------------------------------------------*/

+

+

+void vStartSimpleMQTTDemo( void )

+{

+TickType_t xShortDelay = ( TickType_t ) pdMS_TO_TICKS( ( TickType_t ) 500 );

+

+	/* Wait a short time to allow receipt of the ARP replies. */

+	vTaskDelay( xShortDelay );

+

+	/* This example uses a single application task, which in turn is used to

+	 * connect, subscribe, publish, unsubscribe and disconnect from the MQTT

+	 * broker. */

+	xTaskCreate( prvMQTTDemoTask,          /* Function that implements the task. */

+				 "MQTTDemo",               /* 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. */

+}

+/*-----------------------------------------------------------*/

+

+static void prvMQTTDemoTask( void * pvParameters )

+{

+uint32_t ulNotificationValue = 0, ulPublishCount;

+const uint32_t ulMaxPublishCount = 5UL;

+const TickType_t xNoDelay = ( TickType_t ) 0;

+

+	/* Remove compiler warnings about unused parameters. */

+	( void ) pvParameters;

+

+	/* One time initialization of the libraries used by this demo. */

+	prvInitialiseLibraries();

+

+	for( ; ; )

+	{

+		/* Notifications are used to send events from the callback functions to this

+		 * task.  Don't expect any notifications to be pending at the beginning of the

+		 * loop. */

+		configASSERT( ulTaskNotifyTake( pdTRUE, xNoDelay ) == 0 );

+

+

+		/****************************** Connect. ******************************/

+

+		/* Establish a connection to the MQTT broker. This example connects to

+		 * the MQTT broker as specified by the compile time constants

+		 * mqttexampleBROKER_ENDPOINT and mqttexampleBROKER_PORT.

+		 * Please change it to the MQTT broker you want to connect to. */

+		configPRINTF( ( "Attempt to connect to %s:%d\r\n", mqttexampleBROKER_ENDPOINT, mqttexampleBROKER_PORT ) );

+		prvMQTTConnect();

+		configPRINTF( ( "Connected to %s:%d\r\n", mqttexampleBROKER_ENDPOINT, mqttexampleBROKER_PORT ) );

+

+

+		/**************************** Subscribe. ******************************/

+

+		/* The client is now connected to the broker. Subscribe to the topic

+		 * as specified by the mqttexampleTOPIC compile time constant.  This

+		 * client will then publish to the same topic it subscribed to, so will

+		 * expect all the messages it sends to the broker to be sent back to it

+		 * from the broker. */

+		configPRINTF( ( "Attempt to subscribed to the topic %s\r\n", mqttexampleTOPIC ) );

+		prvMQTTSubscribe();

+		configPRINTF( ( "Subscribed to the topic %s\r\n", mqttexampleTOPIC ) );

+

+

+		/*********************** Publish ulMaxPublishCount messages. **********/

+

+		/* Publish a few messages while connected. */

+		for( ulPublishCount = 0; ulPublishCount < ulMaxPublishCount; ulPublishCount++ )

+		{

+			/* Publish a message on the topic specified by the mqttexampleTOPIC

+			 * compile time constant. */

+			configPRINTF( ( "Publish %s on the topic %s\r\n", mqttexampleMESSAGE, mqttexampleTOPIC ) );

+			prvMQTTPublish();

+			configPRINTF( ( "Published %s on the topic %s\r\n", mqttexampleMESSAGE, mqttexampleTOPIC ) );

+

+			/* Since we are subscribed to the same topic as we published on, we

+			 * will get the same message back from the MQTT broker. Wait for the

+			 * message to be received which is signaled to us by the publish

+			 * callback (prvExample_OnMessageReceived) setting the

+			 * mqttexampleMESSAGE_RECEIVED_BIT bit in this task's notification

+			 * value. Note the bit is then cleared in the task's notification value

+			 * to ensure the bit being set can be detected on the next iteration. */

+			xTaskNotifyWait( 0UL,                             /* Don't clear any bits on entry. */

+							 mqttexampleMESSAGE_RECEIVED_BIT, /* Clear bit on exit. */

+							 &( ulNotificationValue ),        /* Obtain the notification value. */

+							 pdMS_TO_TICKS( mqttexampleMQTT_TIMEOUT_MS ) );

+			configASSERT( ( ulNotificationValue & mqttexampleMESSAGE_RECEIVED_BIT ) == mqttexampleMESSAGE_RECEIVED_BIT );

+		}

+

+		/******************* Unsubscribe and Disconnect. **********************/

+

+		/* Unsubscribe from the topic mqttexampleTOPIC and disconnect

+		 * gracefully. */

+		prvMQTTUnsubscribe();

+		prvMQTTDisconnect();

+		configPRINTF( ( "Disconnected from %s:%d\r\n\r\n", mqttexampleBROKER_ENDPOINT, mqttexampleBROKER_PORT ) );

+

+		/* Wait for the disconnect operation to complete which is signaled to us

+		 * by the disconnect callback (prvExample_OnDisconnect)by setting

+		 * the mqttexampleDISCONNECTED_BIT bit in this task's notification value.

+		 * Note the bit is cleared in the task's notification value again to ensure

+		 * it being set can be detected again on the next iteration. */

+		xTaskNotifyWait( 0UL,                         /* Don't clear any bits on entry. */

+						 mqttexampleDISCONNECTED_BIT, /* Clear bit on exit. */

+						 &( ulNotificationValue ),    /* Obtain the notification value. */

+						 pdMS_TO_TICKS( mqttexampleMQTT_TIMEOUT_MS ) );

+		configASSERT( ( ulNotificationValue & mqttexampleDISCONNECTED_BIT ) == mqttexampleDISCONNECTED_BIT );

+

+		/* Delay between iterations to avoid broker throttling. */

+		configPRINTF( ( "prvMQTTDemoTask() completed an iteration successfully. Total free heap is %u\r\n", xPortGetFreeHeapSize() ) );

+		configPRINTF( ( "Demo completed successfully.\r\n" ) );

+		configPRINTF( ( "Short delay before starting the next iteration.... \r\n\r\n" ) );

+		vTaskDelay( pdMS_TO_TICKS( mqttexampleMQTT_TIMEOUT_MS ) );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvExample_OnDisconnect( void * pvCallbackContext,

+									 IotMqttCallbackParam_t * pxCallbackParams )

+{

+TaskHandle_t xDemoTaskHandle = ( TaskHandle_t ) pvCallbackContext;

+

+	/* Ensure that we initiated the disconnect. */

+	configASSERT( pxCallbackParams->u.disconnectReason == IOT_MQTT_DISCONNECT_CALLED );

+

+	/* Inform the demo task about the disconnect. */

+	xTaskNotify( xDemoTaskHandle,

+				 mqttexampleDISCONNECTED_BIT,

+				 eSetBits /* Set the mqttexampleDISCONNECTED_BIT in the demo task's notification value. */

+				 );

+}

+/*-----------------------------------------------------------*/

+

+static void prvExample_OnMessageReceived( void * pvCallbackContext,

+										  IotMqttCallbackParam_t * pxCallbackParams )

+{

+TaskHandle_t xDemoTaskHandle = ( TaskHandle_t ) pvCallbackContext;

+

+	/* Ensure the message is received on the expected topic. */

+	configASSERT( pxCallbackParams->u.message.info.topicNameLength == strlen( mqttexampleTOPIC ) );

+	configASSERT( strncmp( pxCallbackParams->u.message.info.pTopicName,

+						   mqttexampleTOPIC,

+						   strlen( mqttexampleTOPIC ) ) == 0 );

+

+	/* Ensure the message itself is as expected. */

+	configASSERT( pxCallbackParams->u.message.info.payloadLength == strlen( mqttexampleMESSAGE ) );

+	configASSERT( strncmp( pxCallbackParams->u.message.info.pPayload,

+						   mqttexampleMESSAGE,

+						   strlen( mqttexampleMESSAGE ) ) == 0 );

+

+	/* Ensure the message Quality of Service (QoS) is as expected. */

+	configASSERT( pxCallbackParams->u.message.info.qos == IOT_MQTT_QOS_1 );

+

+	/* So as not to worry about string lengths the print message uses the

+	 * consts rather than the data from the message, but the asserts above have

+	 * already checked the two are equal. */

+	configPRINTF( ( "Received %s on the topic %s\r\n", mqttexampleMESSAGE, mqttexampleTOPIC ) );

+

+	/* Inform the demo task about the message received from the MQTT broker by

+	 * setting the mqttexampleMESSAGE_RECEIVED_BIT bit in the task's notification

+	 * value. */

+	xTaskNotify( xDemoTaskHandle,

+				 mqttexampleMESSAGE_RECEIVED_BIT,

+				 eSetBits /* Set the mqttexampleMESSAGE_RECEIVED_BIT in the demo task's notification value. */

+				 );

+}

+/*-----------------------------------------------------------*/

+

+static void prvMQTTConnect( void )

+{

+IotMqttError_t xResult;

+

+	/* Set the context to pass into the disconnect callback function. */

+	xNetworkInfo.disconnectCallback.pCallbackContext = ( void * ) xTaskGetCurrentTaskHandle();

+

+	/* Establish the connection to the MQTT broker - It is a blocking call and

+	 * will return only when connection is complete or a timeout occurs.  The

+	 * network and connection structures are declared and initialized at the top

+	 * of this file. */

+	xResult = IotMqtt_Connect( &( xNetworkInfo ),

+							   &( xConnectInfo ),

+							   mqttexampleMQTT_TIMEOUT_MS,

+							   &( xMQTTConnection ) );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+}

+/*-----------------------------------------------------------*/

+

+static void prvMQTTDisconnect( void )

+{

+	/* Send a MQTT DISCONNECT packet to the MQTT broker to do a graceful

+	 * disconnect. */

+	IotMqtt_Disconnect( xMQTTConnection,

+						0 /* flags - 0 means a graceful disconnect by sending MQTT DISCONNECT. */

+						);

+}

+/*-----------------------------------------------------------*/

+

+static void prvMQTTSubscribe( void )

+{

+IotMqttError_t xResult;

+IotMqttSubscription_t xMQTTSubscription;

+

+	/* Subscribe to the mqttexampleTOPIC topic filter. The task handle is passed

+	 * as the callback context, which is then used by the callback to send a task

+	 * notification to this task.*/

+	xMQTTSubscription.qos = IOT_MQTT_QOS_1;

+	xMQTTSubscription.pTopicFilter = mqttexampleTOPIC;

+	xMQTTSubscription.topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC );

+	xMQTTSubscription.callback.pCallbackContext = ( void * ) xTaskGetCurrentTaskHandle();

+	xMQTTSubscription.callback.function = prvExample_OnMessageReceived;

+

+	/* Use the synchronous API to subscribe - It is a blocking call and only

+	 * returns when the subscribe operation is complete or a timeout occurs. */

+	xResult = IotMqtt_SubscribeSync( xMQTTConnection,

+									 &( xMQTTSubscription ),

+									 1, /* We are subscribing to one topic filter. */

+									 0, /* flags - currently ignored. */

+									 mqttexampleMQTT_TIMEOUT_MS );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+}

+/*-----------------------------------------------------------*/

+

+static void prvMQTTPublish( void )

+{

+IotMqttError_t xResult;

+IotMqttPublishInfo_t xMQTTPublishInfo;

+

+	/* Publish a message with QoS1 on the mqttexampleTOPIC topic. Since we are

+	 * subscribed to the same topic, the MQTT broker will send the same message

+	 * back to us. It is verified in the publish callback. */

+	xMQTTPublishInfo.qos = IOT_MQTT_QOS_1;

+	xMQTTPublishInfo.retain = false;

+	xMQTTPublishInfo.pTopicName = mqttexampleTOPIC;

+	xMQTTPublishInfo.topicNameLength = ( uint16_t ) strlen( mqttexampleTOPIC );

+	xMQTTPublishInfo.pPayload = mqttexampleMESSAGE;

+	xMQTTPublishInfo.payloadLength = strlen( mqttexampleMESSAGE );

+	xMQTTPublishInfo.retryMs = mqttexamplePUBLISH_RETRY_MS;

+	xMQTTPublishInfo.retryLimit = mqttexamplePUBLISH_RETRY_LIMIT;

+

+	/* Use the synchronous API to publish - It is a blocking call and only

+	 * returns when the publish operation is complete or a timeout occurs. */

+	xResult = IotMqtt_PublishSync( xMQTTConnection,

+								   &( xMQTTPublishInfo ),

+								   0, /* flags - currently ignored. */

+								   mqttexampleMQTT_TIMEOUT_MS );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+}

+/*-----------------------------------------------------------*/

+

+static void prvMQTTUnsubscribe( void )

+{

+IotMqttError_t xResult;

+IotMqttSubscription_t xMQTTSubscription;

+

+	/* Unsubscribe from the mqttexampleTOPIC topic filter. */

+	xMQTTSubscription.pTopicFilter = mqttexampleTOPIC;

+	xMQTTSubscription.topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC );

+

+	/* The following members of the IotMqttSubscription_t are ignored by the

+	 * unsubscribe operation. Just initialize them to avoid "use of uninitialized

+	 * variable" warnings. */

+	xMQTTSubscription.qos = IOT_MQTT_QOS_1;

+	xMQTTSubscription.callback.pCallbackContext = NULL;

+	xMQTTSubscription.callback.function = NULL;

+

+	/* Use the synchronous API to unsubscribe - It is a blocking call and only

+	 * returns when the unsubscribe operation is complete or a timeout occurs. */

+	xResult = IotMqtt_UnsubscribeSync( xMQTTConnection,

+									   &( xMQTTSubscription ),

+									   1, /* We are unsubscribing from one topic filter. */

+									   0, /* flags - currently ignored. */

+									   mqttexampleMQTT_TIMEOUT_MS );

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+}

+/*-----------------------------------------------------------*/

+

+static void prvInitialiseLibraries( void )

+{

+IotTaskPoolError_t xTaskPoolResult;

+IotMqttError_t xResult;

+IotNetworkError_t xNetworkResult;

+

+	/* The MQTT library needs a task pool, so create the system task pool. */

+	xTaskPoolResult = IotTaskPool_CreateSystemTaskPool( &( xTaskPoolParameters ) );

+	configASSERT( xTaskPoolResult == IOT_TASKPOOL_SUCCESS );

+

+	/* Initialize the network stack abstraction for FreeRTOS. */

+	xNetworkResult = IotNetworkFreeRTOS_Init();

+	configASSERT( xNetworkResult == IOT_NETWORK_SUCCESS );

+

+	/* MQTT library must be initialized before it can be used. This is just one

+	 * time initialization. */

+	xResult = IotMqtt_Init();

+	configASSERT( xResult == IOT_MQTT_SUCCESS );

+}

+/*-----------------------------------------------------------*/

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/Run-time-stats-utils.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/Run-time-stats-utils.c
new file mode 100644
index 0000000..d9b7a59
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/Run-time-stats-utils.c
@@ -0,0 +1,99 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/*

+ * Utility functions required to gather run time statistics.  See:

+ * http://www.freertos.org/rtos-run-time-stats.html

+ *

+ * Note that this is a simulated port, where simulated time is a lot slower than

+ * real time, therefore the run time counter values have no real meaningful

+ * units.

+ *

+ * Also note that it is assumed this demo is going to be used for short periods

+ * of time only, and therefore timer overflows are not handled.

+*/

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+

+/* Variables used in the creation of the run time stats time base.  Run time

+stats record how much time each task spends in the Running state. */

+static long long llInitialRunTimeCounterValue = 0LL, llTicksPerHundedthMillisecond = 0LL;

+

+/*-----------------------------------------------------------*/

+

+void vConfigureTimerForRunTimeStats( void )

+{

+LARGE_INTEGER liPerformanceCounterFrequency, liInitialRunTimeValue;

+

+	/* Initialise the variables used to create the run time stats time base.

+	Run time stats record how much time each task spends in the Running

+	state. */

+

+	if( QueryPerformanceFrequency( &liPerformanceCounterFrequency ) == 0 )

+	{

+		llTicksPerHundedthMillisecond = 1;

+	}

+	else

+	{

+		/* How many times does the performance counter increment in 1/100th

+		millisecond. */

+		llTicksPerHundedthMillisecond = liPerformanceCounterFrequency.QuadPart / 100000LL;

+

+		/* What is the performance counter value now, this will be subtracted

+		from readings taken at run time. */

+		QueryPerformanceCounter( &liInitialRunTimeValue );

+		llInitialRunTimeCounterValue = liInitialRunTimeValue.QuadPart;

+	}

+}

+/*-----------------------------------------------------------*/

+

+unsigned long ulGetRunTimeCounterValue( void )

+{

+LARGE_INTEGER liCurrentCount;

+unsigned long ulReturn;

+

+	/* What is the performance counter value now? */

+	QueryPerformanceCounter( &liCurrentCount );

+

+	/* Subtract the performance counter value reading taken when the

+	application started to get a count from that reference point, then

+	scale to (simulated) 1/100ths of a millisecond. */

+	if( llTicksPerHundedthMillisecond == 0 )

+	{

+		/* The trace macros are probably calling this function before the

+		scheduler has been started. */

+		ulReturn = 0;

+	}

+	else

+	{

+		ulReturn = ( unsigned long ) ( ( liCurrentCount.QuadPart - llInitialRunTimeCounterValue ) / llTicksPerHundedthMillisecond );

+	}

+

+	return ulReturn;

+}

+/*-----------------------------------------------------------*/

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/Packet32.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/Packet32.h
new file mode 100644
index 0000000..1e0eacd
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/Packet32.h
@@ -0,0 +1,359 @@
+/*

+ * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)

+ * Copyright (c) 2005 - 2007 CACE Technologies, Davis (California)

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ *

+ * 1. Redistributions of source code must retain the above copyright

+ * notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ * notice, this list of conditions and the following disclaimer in the

+ * documentation and/or other materials provided with the distribution.

+ * 3. Neither the name of the Politecnico di Torino, CACE Technologies 

+ * nor the names of its contributors may be used to endorse or promote 

+ * products derived from this software without specific prior written 

+ * permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ *

+ */

+

+/** @ingroup packetapi

+ *  @{ 

+ */

+

+/** @defgroup packet32h Packet.dll definitions and data structures

+ *  Packet32.h contains the data structures and the definitions used by packet.dll.

+ *  The file is used both by the Win9x and the WinNTx versions of packet.dll, and can be included

+ *  by the applications that use the functions of this library

+ *  @{

+ */

+

+#ifndef __PACKET32

+#define __PACKET32

+

+#include <winsock2.h>

+

+#ifdef HAVE_AIRPCAP_API

+#include <airpcap.h>

+#else

+#if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_)

+#define AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_

+typedef struct _AirpcapHandle *PAirpcapHandle;

+#endif /* AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ */

+#endif /* HAVE_AIRPCAP_API */

+

+#ifdef HAVE_DAG_API

+#include <dagc.h>

+#endif /* HAVE_DAG_API */

+

+// Working modes

+#define PACKET_MODE_CAPT 0x0 ///< Capture mode

+#define PACKET_MODE_STAT 0x1 ///< Statistical mode

+#define PACKET_MODE_MON 0x2 ///< Monitoring mode

+#define PACKET_MODE_DUMP 0x10 ///< Dump mode

+#define PACKET_MODE_STAT_DUMP MODE_DUMP | MODE_STAT ///< Statistical dump Mode

+

+

+/// Alignment macro. Defines the alignment size.

+#define Packet_ALIGNMENT sizeof(int)

+/// Alignment macro. Rounds up to the next even multiple of Packet_ALIGNMENT. 

+#define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1))

+

+#define NdisMediumNull	-1		///< Custom linktype: NDIS doesn't provide an equivalent

+#define NdisMediumCHDLC	-2		///< Custom linktype: NDIS doesn't provide an equivalent

+#define NdisMediumPPPSerial	-3	///< Custom linktype: NDIS doesn't provide an equivalent

+#define NdisMediumBare80211	-4	///< Custom linktype: NDIS doesn't provide an equivalent

+#define NdisMediumRadio80211	-5	///< Custom linktype: NDIS doesn't provide an equivalent

+#define NdisMediumPpi		-6	///< Custom linktype: NDIS doesn't provide an equivalent

+

+// Loopback behaviour definitions

+#define NPF_DISABLE_LOOPBACK	1	///< Drop the packets sent by the NPF driver

+#define NPF_ENABLE_LOOPBACK		2	///< Capture the packets sent by the NPF driver

+

+/*!

+  \brief Network type structure.

+

+  This structure is used by the PacketGetNetType() function to return information on the current adapter's type and speed.

+*/

+typedef struct NetType

+{

+	UINT LinkType;	///< The MAC of the current network adapter (see function PacketGetNetType() for more information)

+	ULONGLONG LinkSpeed;	///< The speed of the network in bits per second

+}NetType;

+

+

+//some definitions stolen from libpcap

+

+#ifndef BPF_MAJOR_VERSION

+

+/*!

+  \brief A BPF pseudo-assembly program.

+

+  The program will be injected in the kernel by the PacketSetBPF() function and applied to every incoming packet. 

+*/

+struct bpf_program 

+{

+	UINT bf_len;				///< Indicates the number of instructions of the program, i.e. the number of struct bpf_insn that will follow.

+	struct bpf_insn *bf_insns;	///< A pointer to the first instruction of the program.

+};

+

+/*!

+  \brief A single BPF pseudo-instruction.

+

+  bpf_insn contains a single instruction for the BPF register-machine. It is used to send a filter program to the driver.

+*/

+struct bpf_insn 

+{

+	USHORT	code;		///< Instruction type and addressing mode.

+	UCHAR 	jt;			///< Jump if true

+	UCHAR 	jf;			///< Jump if false

+	int k;				///< Generic field used for various purposes.

+};

+

+/*!

+  \brief Structure that contains a couple of statistics values on the current capture.

+

+  It is used by packet.dll to return statistics about a capture session.

+*/

+struct bpf_stat 

+{

+	UINT bs_recv;		///< Number of packets that the driver received from the network adapter 

+						///< from the beginning of the current capture. This value includes the packets 

+						///< lost by the driver.

+	UINT bs_drop;		///< number of packets that the driver lost from the beginning of a capture. 

+						///< Basically, a packet is lost when the the buffer of the driver is full. 

+						///< In this situation the packet cannot be stored and the driver rejects it.

+	UINT ps_ifdrop;		///< drops by interface. XXX not yet supported

+	UINT bs_capt;		///< number of packets that pass the filter, find place in the kernel buffer and

+						///< thus reach the application.

+};

+

+/*!

+  \brief Packet header.

+

+  This structure defines the header associated with every packet delivered to the application.

+*/

+struct bpf_hdr 

+{

+	struct timeval	bh_tstamp;	///< The timestamp associated with the captured packet. 

+								///< It is stored in a TimeVal structure.

+	UINT	bh_caplen;			///< Length of captured portion. The captured portion <b>can be different</b>

+								///< from the original packet, because it is possible (with a proper filter)

+								///< to instruct the driver to capture only a portion of the packets.

+	UINT	bh_datalen;			///< Original length of packet

+	USHORT		bh_hdrlen;		///< Length of bpf header (this struct plus alignment padding). In some cases,

+								///< a padding could be added between the end of this structure and the packet

+								///< data for performance reasons. This filed can be used to retrieve the actual data 

+								///< of the packet.

+};

+

+/*!

+  \brief Dump packet header.

+

+  This structure defines the header associated with the packets in a buffer to be used with PacketSendPackets().

+  It is simpler than the bpf_hdr, because it corresponds to the header associated by WinPcap and libpcap to a

+  packet in a dump file. This makes straightforward sending WinPcap dump files to the network.

+*/

+struct dump_bpf_hdr{

+    struct timeval	ts;			///< Time stamp of the packet

+    UINT			caplen;		///< Length of captured portion. The captured portion can smaller than the 

+								///< the original packet, because it is possible (with a proper filter) to 

+								///< instruct the driver to capture only a portion of the packets. 

+    UINT			len;		///< Length of the original packet (off wire).

+};

+

+

+#endif

+

+struct bpf_stat;

+

+#define        DOSNAMEPREFIX   TEXT("Packet_")	///< Prefix added to the adapters device names to create the WinPcap devices

+#define        MAX_LINK_NAME_LENGTH	64			//< Maximum length of the devices symbolic links

+#define        NMAX_PACKET 65535

+

+/*!

+  \brief Addresses of a network adapter.

+

+  This structure is used by the PacketGetNetInfoEx() function to return the IP addresses associated with 

+  an adapter.

+*/

+typedef struct npf_if_addr {

+	struct sockaddr_storage IPAddress;	///< IP address.

+	struct sockaddr_storage SubnetMask;	///< Netmask for that address.

+	struct sockaddr_storage Broadcast;	///< Broadcast address.

+}npf_if_addr;

+

+

+#define ADAPTER_NAME_LENGTH 256 + 12	///<  Maximum length for the name of an adapter. The value is the same used by the IP Helper API.

+#define ADAPTER_DESC_LENGTH 128			///<  Maximum length for the description of an adapter. The value is the same used by the IP Helper API.

+#define MAX_MAC_ADDR_LENGTH 8			///<  Maximum length for the link layer address of an adapter. The value is the same used by the IP Helper API.

+#define MAX_NETWORK_ADDRESSES 16		///<  Maximum length for the link layer address of an adapter. The value is the same used by the IP Helper API.

+

+

+typedef struct WAN_ADAPTER_INT WAN_ADAPTER; ///< Describes an opened wan (dialup, VPN...) network adapter using the NetMon API

+typedef WAN_ADAPTER *PWAN_ADAPTER; ///< Describes an opened wan (dialup, VPN...) network adapter using the NetMon API

+

+#define INFO_FLAG_NDIS_ADAPTER		0	///< Flag for ADAPTER_INFO: this is a traditional ndis adapter

+#define INFO_FLAG_NDISWAN_ADAPTER	1	///< Flag for ADAPTER_INFO: this is a NdisWan adapter, and it's managed by WANPACKET

+#define INFO_FLAG_DAG_CARD			2	///< Flag for ADAPTER_INFO: this is a DAG card

+#define INFO_FLAG_DAG_FILE			6	///< Flag for ADAPTER_INFO: this is a DAG file

+#define INFO_FLAG_DONT_EXPORT		8	///< Flag for ADAPTER_INFO: when this flag is set, the adapter will not be listed or openend by winpcap. This allows to prevent exporting broken network adapters, like for example FireWire ones.

+#define INFO_FLAG_AIRPCAP_CARD		16	///< Flag for ADAPTER_INFO: this is an airpcap card

+#define INFO_FLAG_NPFIM_DEVICE		32

+

+/*!

+  \brief Describes an opened network adapter.

+

+  This structure is the most important for the functioning of packet.dll, but the great part of its fields

+  should be ignored by the user, since the library offers functions that avoid to cope with low-level parameters

+*/

+typedef struct _ADAPTER  { 

+	HANDLE hFile;				///< \internal Handle to an open instance of the NPF driver.

+	CHAR  SymbolicLink[MAX_LINK_NAME_LENGTH]; ///< \internal A string containing the name of the network adapter currently opened.

+	int NumWrites;				///< \internal Number of times a packets written on this adapter will be repeated 

+								///< on the wire.

+	HANDLE ReadEvent;			///< A notification event associated with the read calls on the adapter.

+								///< It can be passed to standard Win32 functions (like WaitForSingleObject

+								///< or WaitForMultipleObjects) to wait until the driver's buffer contains some 

+								///< data. It is particularly useful in GUI applications that need to wait 

+								///< concurrently on several events. In Windows NT/2000 the PacketSetMinToCopy()

+								///< function can be used to define the minimum amount of data in the kernel buffer

+								///< that will cause the event to be signalled. 

+	

+	UINT ReadTimeOut;			///< \internal The amount of time after which a read on the driver will be released and 

+								///< ReadEvent will be signaled, also if no packets were captured

+	CHAR Name[ADAPTER_NAME_LENGTH];

+	PWAN_ADAPTER pWanAdapter;

+	UINT Flags;					///< Adapter's flags. Tell if this adapter must be treated in a different way, using the Netmon API or the dagc API.

+

+#ifdef HAVE_AIRPCAP_API

+	PAirpcapHandle	AirpcapAd;

+#endif // HAVE_AIRPCAP_API

+

+#ifdef HAVE_NPFIM_API

+	void* NpfImHandle;

+#endif // HAVE_NPFIM_API

+

+#ifdef HAVE_DAG_API

+	dagc_t *pDagCard;			///< Pointer to the dagc API adapter descriptor for this adapter

+	PCHAR DagBuffer;			///< Pointer to the buffer with the packets that is received from the DAG card

+	struct timeval DagReadTimeout;	///< Read timeout. The dagc API requires a timeval structure

+	unsigned DagFcsLen;			///< Length of the frame check sequence attached to any packet by the card. Obtained from the registry

+	DWORD DagFastProcess;		///< True if the user requests fast capture processing on this card. Higher level applications can use this value to provide a faster but possibly unprecise capture (for example, libpcap doesn't convert the timestamps).

+#endif // HAVE_DAG_API

+}  ADAPTER, *LPADAPTER;

+

+/*!

+  \brief Structure that contains a group of packets coming from the driver.

+

+  This structure defines the header associated with every packet delivered to the application.

+*/

+typedef struct _PACKET {  

+	HANDLE       hEvent;		///< \deprecated Still present for compatibility with old applications.

+	OVERLAPPED   OverLapped;	///< \deprecated Still present for compatibility with old applications.

+	PVOID        Buffer;		///< Buffer with containing the packets. See the PacketReceivePacket() for

+								///< details about the organization of the data in this buffer

+	UINT         Length;		///< Length of the buffer

+	DWORD        ulBytesReceived;	///< Number of valid bytes present in the buffer, i.e. amount of data

+									///< received by the last call to PacketReceivePacket()

+	BOOLEAN      bIoComplete;	///< \deprecated Still present for compatibility with old applications.

+}  PACKET, *LPPACKET;

+

+/*!

+  \brief Structure containing an OID request.

+

+  It is used by the PacketRequest() function to send an OID to the interface card driver. 

+  It can be used, for example, to retrieve the status of the error counters on the adapter, its MAC address, 

+  the list of the multicast groups defined on it, and so on.

+*/

+struct _PACKET_OID_DATA {

+    ULONG Oid;					///< OID code. See the Microsoft DDK documentation or the file ntddndis.h

+								///< for a complete list of valid codes.

+    ULONG Length;				///< Length of the data field

+    UCHAR Data[1];				///< variable-lenght field that contains the information passed to or received 

+								///< from the adapter.

+}; 

+typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA;

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**

+ *  @}

+ */

+

+/*

+BOOLEAN QueryWinPcapRegistryStringA(CHAR *SubKeyName,

+								 CHAR *Value,

+								 UINT *pValueLen,

+								 CHAR *DefaultVal);

+

+BOOLEAN QueryWinPcapRegistryStringW(WCHAR *SubKeyName,

+								 WCHAR *Value,

+								 UINT *pValueLen,

+								 WCHAR *DefaultVal);

+*/

+								 

+//---------------------------------------------------------------------------

+// EXPORTED FUNCTIONS

+//---------------------------------------------------------------------------

+

+PCHAR PacketGetVersion();

+PCHAR PacketGetDriverVersion();

+BOOLEAN PacketSetMinToCopy(LPADAPTER AdapterObject,int nbytes);

+BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites);

+BOOLEAN PacketSetMode(LPADAPTER AdapterObject,int mode);

+BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout);

+BOOLEAN PacketSetBpf(LPADAPTER AdapterObject,struct bpf_program *fp);

+BOOLEAN PacketSetLoopbackBehavior(LPADAPTER  AdapterObject, UINT LoopbackBehavior);

+INT PacketSetSnapLen(LPADAPTER AdapterObject,int snaplen);

+BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s);

+BOOLEAN PacketGetStatsEx(LPADAPTER AdapterObject,struct bpf_stat *s);

+BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim);

+BOOLEAN PacketGetNetType (LPADAPTER AdapterObject,NetType *type);

+LPADAPTER PacketOpenAdapter(PCHAR AdapterName);

+BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET pPacket,BOOLEAN Sync);

+INT PacketSendPackets(LPADAPTER AdapterObject,PVOID PacketBuff,ULONG Size, BOOLEAN Sync);

+LPPACKET PacketAllocatePacket(void);

+VOID PacketInitPacket(LPPACKET lpPacket,PVOID  Buffer,UINT  Length);

+VOID PacketFreePacket(LPPACKET lpPacket);

+BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync);

+BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter);

+BOOLEAN PacketGetAdapterNames(PTSTR pStr,PULONG  BufferSize);

+BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries);

+BOOLEAN PacketRequest(LPADAPTER  AdapterObject,BOOLEAN Set,PPACKET_OID_DATA  OidData);

+HANDLE PacketGetReadEvent(LPADAPTER AdapterObject);

+BOOLEAN PacketSetDumpName(LPADAPTER AdapterObject, void *name, int len);

+BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks);

+BOOLEAN PacketIsDumpEnded(LPADAPTER AdapterObject, BOOLEAN sync);

+BOOL PacketStopDriver();

+VOID PacketCloseAdapter(LPADAPTER lpAdapter);

+BOOLEAN PacketStartOem(PCHAR errorString, UINT errorStringLength);

+BOOLEAN PacketStartOemEx(PCHAR errorString, UINT errorStringLength, ULONG flags);

+PAirpcapHandle PacketGetAirPcapHandle(LPADAPTER AdapterObject);

+

+//

+// Used by PacketStartOemEx

+//

+#define PACKET_START_OEM_NO_NETMON	0x00000001

+

+#ifdef __cplusplus

+}

+#endif 

+

+#endif //__PACKET32

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/PacketData.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/PacketData.h
new file mode 100644
index 0000000..8124db6
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/PacketData.h
@@ -0,0 +1,267 @@
+char pkt1[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x30, 0x09, 0x9c, 0x40, 0x00, 0x80, 0x06,

+0x6f, 0x07, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x70, 0x02,

+0x40, 0x00, 0xdf, 0xab, 0x00, 0x00, 0x02, 0x04,

+0x05, 0xb4, 0x01, 0x01, 0x04, 0x02 };

+

+char pkt2[] = {

+0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01,

+0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x2c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,

+0xf8, 0xa6, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8,

+0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00,

+0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12,

+0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04,

+0x05, 0x92 };

+

+char pkt3[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x28, 0x09, 0x9e, 0x40, 0x00, 0x80, 0x06,

+0x6f, 0x0d, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc7, 0x36, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10,

+0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 };

+

+char pkt4[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x02, 0x27, 0x09, 0x9f, 0x40, 0x00, 0x80, 0x06,

+0x6d, 0x0d, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc7, 0x36, 0x00, 0x00, 0x06, 0x69, 0x50, 0x18,

+0x42, 0xd8, 0x84, 0x3e, 0x00, 0x00, 0x47, 0x45,

+0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50,

+0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x41, 0x63,

+0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x69, 0x6d,

+0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x2c,

+0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78,

+0x2d, 0x78, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70,

+0x2c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f,

+0x6a, 0x70, 0x65, 0x67, 0x2c, 0x20, 0x69, 0x6d,

+0x61, 0x67, 0x65, 0x2f, 0x70, 0x6a, 0x70, 0x65,

+0x67, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,

+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76,

+0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d, 0x65, 0x78,

+0x63, 0x65, 0x6c, 0x2c, 0x20, 0x61, 0x70, 0x70,

+0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,

+0x2f, 0x6d, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2c,

+0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,

+0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64,

+0x2e, 0x6d, 0x73, 0x2d, 0x70, 0x6f, 0x77, 0x65,

+0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2c, 0x20,

+0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,

+0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73,

+0x2d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,

+0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x70,

+0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,

+0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73, 0x2d, 0x78,

+0x62, 0x61, 0x70, 0x2c, 0x20, 0x61, 0x70, 0x70,

+0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,

+0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d,

+0x78, 0x70, 0x73, 0x64, 0x6f, 0x63, 0x75, 0x6d,

+0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x70, 0x70,

+0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,

+0x2f, 0x78, 0x61, 0x6d, 0x6c, 0x2b, 0x78, 0x6d,

+0x6c, 0x2c, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a,

+0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c,

+0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a,

+0x20, 0x65, 0x6e, 0x2d, 0x67, 0x62, 0x0d, 0x0a,

+0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45,

+0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a,

+0x20, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x20, 0x64,

+0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x0d, 0x0a,

+0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65,

+0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69,

+0x6c, 0x6c, 0x61, 0x2f, 0x34, 0x2e, 0x30, 0x20,

+0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69,

+0x62, 0x6c, 0x65, 0x3b, 0x20, 0x4d, 0x53, 0x49,

+0x45, 0x20, 0x36, 0x2e, 0x30, 0x3b, 0x20, 0x57,

+0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x4e,

+0x54, 0x20, 0x35, 0x2e, 0x31, 0x3b, 0x20, 0x53,

+0x56, 0x31, 0x3b, 0x20, 0x47, 0x6f, 0x6f, 0x67,

+0x6c, 0x65, 0x54, 0x35, 0x3b, 0x20, 0x2e, 0x4e,

+0x45, 0x54, 0x20, 0x43, 0x4c, 0x52, 0x20, 0x32,

+0x2e, 0x30, 0x2e, 0x35, 0x30, 0x37, 0x32, 0x37,

+0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43,

+0x4c, 0x52, 0x20, 0x33, 0x2e, 0x30, 0x2e, 0x30,

+0x34, 0x35, 0x30, 0x36, 0x2e, 0x36, 0x34, 0x38,

+0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43,

+0x4c, 0x52, 0x20, 0x33, 0x2e, 0x35, 0x2e, 0x32,

+0x31, 0x30, 0x32, 0x32, 0x29, 0x0d, 0x0a, 0x48,

+0x6f, 0x73, 0x74, 0x3a, 0x20, 0x31, 0x39, 0x32,

+0x2e, 0x31, 0x36, 0x38, 0x2e, 0x30, 0x2e, 0x31,

+0x32, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65,

+0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4b,

+0x65, 0x65, 0x70, 0x2d, 0x41, 0x6c, 0x69, 0x76,

+0x65, 0x0d, 0x0a, 0x0d, 0x0a };

+

+char pkt5[] = {

+0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01,

+0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x2c, 0x00, 0x02, 0x00, 0x00, 0x40, 0x06,

+0xf8, 0xa5, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8,

+0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00,

+0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12,

+0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04,

+0x05, 0x92 };

+

+char pkt6[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x28, 0x09, 0xa1, 0x40, 0x00, 0x80, 0x06,

+0x6f, 0x0a, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10,

+0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 };

+

+char pkt7[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x02, 0x27, 0x09, 0xa2, 0x40, 0x00, 0x80, 0x06,

+0x6d, 0x0a, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc7, 0x36, 0x00, 0x00, 0x06, 0x69, 0x50, 0x18,

+0x42, 0xd8, 0x84, 0x3e, 0x00, 0x00, 0x47, 0x45,

+0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50,

+0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x41, 0x63,

+0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x69, 0x6d,

+0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x2c,

+0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78,

+0x2d, 0x78, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70,

+0x2c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f,

+0x6a, 0x70, 0x65, 0x67, 0x2c, 0x20, 0x69, 0x6d,

+0x61, 0x67, 0x65, 0x2f, 0x70, 0x6a, 0x70, 0x65,

+0x67, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,

+0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76,

+0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d, 0x65, 0x78,

+0x63, 0x65, 0x6c, 0x2c, 0x20, 0x61, 0x70, 0x70,

+0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,

+0x2f, 0x6d, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2c,

+0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,

+0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64,

+0x2e, 0x6d, 0x73, 0x2d, 0x70, 0x6f, 0x77, 0x65,

+0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2c, 0x20,

+0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,

+0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73,

+0x2d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,

+0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x70,

+0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,

+0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73, 0x2d, 0x78,

+0x62, 0x61, 0x70, 0x2c, 0x20, 0x61, 0x70, 0x70,

+0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,

+0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d,

+0x78, 0x70, 0x73, 0x64, 0x6f, 0x63, 0x75, 0x6d,

+0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x70, 0x70,

+0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,

+0x2f, 0x78, 0x61, 0x6d, 0x6c, 0x2b, 0x78, 0x6d,

+0x6c, 0x2c, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a,

+0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c,

+0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a,

+0x20, 0x65, 0x6e, 0x2d, 0x67, 0x62, 0x0d, 0x0a,

+0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45,

+0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a,

+0x20, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x20, 0x64,

+0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x0d, 0x0a,

+0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65,

+0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69,

+0x6c, 0x6c, 0x61, 0x2f, 0x34, 0x2e, 0x30, 0x20,

+0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69,

+0x62, 0x6c, 0x65, 0x3b, 0x20, 0x4d, 0x53, 0x49,

+0x45, 0x20, 0x36, 0x2e, 0x30, 0x3b, 0x20, 0x57,

+0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x4e,

+0x54, 0x20, 0x35, 0x2e, 0x31, 0x3b, 0x20, 0x53,

+0x56, 0x31, 0x3b, 0x20, 0x47, 0x6f, 0x6f, 0x67,

+0x6c, 0x65, 0x54, 0x35, 0x3b, 0x20, 0x2e, 0x4e,

+0x45, 0x54, 0x20, 0x43, 0x4c, 0x52, 0x20, 0x32,

+0x2e, 0x30, 0x2e, 0x35, 0x30, 0x37, 0x32, 0x37,

+0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43,

+0x4c, 0x52, 0x20, 0x33, 0x2e, 0x30, 0x2e, 0x30,

+0x34, 0x35, 0x30, 0x36, 0x2e, 0x36, 0x34, 0x38,

+0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43,

+0x4c, 0x52, 0x20, 0x33, 0x2e, 0x35, 0x2e, 0x32,

+0x31, 0x30, 0x32, 0x32, 0x29, 0x0d, 0x0a, 0x48,

+0x6f, 0x73, 0x74, 0x3a, 0x20, 0x31, 0x39, 0x32,

+0x2e, 0x31, 0x36, 0x38, 0x2e, 0x30, 0x2e, 0x31,

+0x32, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65,

+0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4b,

+0x65, 0x65, 0x70, 0x2d, 0x41, 0x6c, 0x69, 0x76,

+0x65, 0x0d, 0x0a, 0x0d, 0x0a };

+

+char pkt8[] = {

+0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01,

+0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x2c, 0x00, 0x03, 0x00, 0x00, 0x40, 0x06,

+0xf8, 0xa4, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8,

+0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00,

+0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12,

+0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04,

+0x05, 0x92 };

+

+char pkt9[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x28, 0x09, 0xa3, 0x40, 0x00, 0x80, 0x06,

+0x6f, 0x08, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10,

+0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 };

+

+char pkt10[] = {

+0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01,

+0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x2c, 0x00, 0x04, 0x00, 0x00, 0x40, 0x06,

+0xf8, 0xa3, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8,

+0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00,

+0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12,

+0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04,

+0x05, 0x92 };

+

+char pkt11[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x28, 0x09, 0xa6, 0x40, 0x00, 0x80, 0x06,

+0x6f, 0x05, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10,

+0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 };

+

+char pkt12[] = {

+0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14,

+0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00,

+0x00, 0x28, 0x09, 0xa7, 0x40, 0x00, 0x80, 0x06,

+0x6f, 0x04, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8,

+0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7,

+0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x14,

+0x00, 0x00, 0x43, 0xf4, 0x00, 0x00 };

+

+

+typedef struct

+{

+	char *pcData;

+	int iDataLen;

+} xPacketData;

+

+xPacketData xAllPackets[] =

+{

+	{ pkt1, sizeof( pkt1 ) },

+//	{ pkt2, sizeof( pkt2 ) },

+	{ pkt3, sizeof( pkt3 ) },

+	{ pkt4, sizeof( pkt4 ) },

+//	{ pkt5, sizeof( pkt5 ) },

+	{ pkt6, sizeof( pkt6 ) },

+	{ pkt7, sizeof( pkt7 ) },

+	{ pkt8, sizeof( pkt8 ) },

+	{ pkt9, sizeof( pkt9 ) },

+	{ pkt10, sizeof( pkt10 ) },

+//	{ pkt11, sizeof( pkt11 ) },

+//	{ pkt12, sizeof( pkt12 ) },

+//	{ pkt13, sizeof( pkt13 ) },

+//	{ pkt14, sizeof( pkt14 ) },

+//	{ pkt15, sizeof( pkt15 ) },

+//	{ pkt16, sizeof( pkt16 ) },

+};

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/Win32-Extensions.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/Win32-Extensions.h
new file mode 100644
index 0000000..be71c85
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/Win32-Extensions.h
@@ -0,0 +1,114 @@
+/*

+ * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)

+ * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California)

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ *

+ * 1. Redistributions of source code must retain the above copyright

+ * notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ * notice, this list of conditions and the following disclaimer in the

+ * documentation and/or other materials provided with the distribution.

+ * 3. Neither the name of the Politecnico di Torino, CACE Technologies 

+ * nor the names of its contributors may be used to endorse or promote 

+ * products derived from this software without specific prior written 

+ * permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ *

+ */

+

+

+#ifndef __WIN32_EXTENSIONS_H__

+#define __WIN32_EXTENSIONS_H__

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Definitions */

+

+/*!

+  \brief A queue of raw packets that will be sent to the network with pcap_sendqueue_transmit().

+*/

+struct pcap_send_queue

+{

+	u_int maxlen;		///< Maximum size of the the queue, in bytes. This variable contains the size of the buffer field.

+	u_int len;			///< Current size of the queue, in bytes.

+	char *buffer;		///< Buffer containing the packets to be sent.

+};

+

+typedef struct pcap_send_queue pcap_send_queue;

+

+/*!

+  \brief This typedef is a support for the pcap_get_airpcap_handle() function

+*/

+#if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_)

+#define AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_

+typedef struct _AirpcapHandle *PAirpcapHandle;

+#endif

+

+#define		BPF_MEM_EX_IMM	0xc0

+#define		BPF_MEM_EX_IND	0xe0

+

+/*used for ST*/

+#define		BPF_MEM_EX		0xc0

+#define		BPF_TME					0x08

+

+#define		BPF_LOOKUP				0x90   

+#define		BPF_EXECUTE				0xa0

+#define		BPF_INIT				0xb0

+#define		BPF_VALIDATE			0xc0

+#define		BPF_SET_ACTIVE			0xd0

+#define		BPF_RESET				0xe0

+#define		BPF_SET_MEMORY			0x80

+#define		BPF_GET_REGISTER_VALUE	0x70

+#define		BPF_SET_REGISTER_VALUE	0x60

+#define		BPF_SET_WORKING			0x50

+#define		BPF_SET_ACTIVE_READ		0x40

+#define		BPF_SET_AUTODELETION	0x30

+#define		BPF_SEPARATION			0xff

+

+/* Prototypes */

+pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);

+

+void pcap_sendqueue_destroy(pcap_send_queue* queue);

+

+int pcap_sendqueue_queue(pcap_send_queue* queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);

+

+u_int pcap_sendqueue_transmit(pcap_t *p, pcap_send_queue* queue, int sync);

+

+HANDLE pcap_getevent(pcap_t *p);

+

+struct pcap_stat *pcap_stats_ex(pcap_t *p, int *pcap_stat_size);

+

+int pcap_setuserbuffer(pcap_t *p, int size);

+

+int pcap_live_dump(pcap_t *p, char *filename, int maxsize, int maxpacks);

+

+int pcap_live_dump_ended(pcap_t *p, int sync);

+

+int pcap_offline_filter(struct bpf_program *prog, const struct pcap_pkthdr *header, const u_char *pkt_data);

+

+int pcap_start_oem(char* err_str, int flags);

+

+PAirpcapHandle pcap_get_airpcap_handle(pcap_t *p);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif //__WIN32_EXTENSIONS_H__

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/arch.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/arch.c
new file mode 100644
index 0000000..02bf82b
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/arch.c
@@ -0,0 +1,336 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/* WinPCap includes. */

+#include "pcap.h"

+#include "remote-ext.h"

+

+/* uIP includes. */

+#include "net/uip.h"

+#include "net/uip_arp.h"

+#include "net/clock-arch.h"

+

+/* FreeRTOS includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "queue.h"

+

+/*

+ * Query the computer the simulation is being executed on to find the network

+ * interfaces it has installed.

+ */

+static pcap_if_t * prvPrintAvailableNetworkInterfaces( void );

+

+/*

+ * Open the network interface.  The number of the interface to be opened is set

+ * by the configNETWORK_INTERFACE_TO_USE constant in FreeRTOSConfig.h.

+ */

+static void prvOpenSelectedNetworkInterface( pcap_if_t *pxAllNetworkInterfaces );

+

+/*

+ * Configure the capture filter to allow blocking reads, and to filter out

+ * packets that are not of interest to this demo.

+ */

+static void prvConfigureCaptureBehaviour( void );

+

+pcap_t *pxOpenedInterfaceHandle = NULL;

+LARGE_INTEGER freq, sys_start_time;

+

+#define archNUM_BUFFERS	5

+#define archNUM_BUFFER_POINTERS ( archNUM_BUFFERS - 1 )

+

+static void prvInterruptSimulator( void *pvParameters );

+

+static unsigned char ucEthernetBuffer[ archNUM_BUFFERS ][ UIP_CONF_BUFFER_SIZE ];

+static unsigned char *pucEthernetBufferPointers[ archNUM_BUFFER_POINTERS ];

+

+static long lLengthOfDataInBuffer[ archNUM_BUFFER_POINTERS ] = { 0 };

+static unsigned char ucNextBufferToFill = 0U, ucNextBufferToProcess = 0U;

+

+unsigned char *uip_buf = NULL;

+char cErrorBuffer[PCAP_ERRBUF_SIZE];

+

+void vNetifTx( void )

+{

+	pcap_sendpacket( pxOpenedInterfaceHandle, uip_buf, uip_len );

+	pcap_sendpacket( pxOpenedInterfaceHandle, uip_buf, uip_len );

+}

+/*-----------------------------------------------------------*/

+

+UBaseType_t uxNetifRx( void )

+{

+UBaseType_t xDataLen;

+unsigned char *pucTemp;

+

+	/* Check there is really data available. */

+	xDataLen = lLengthOfDataInBuffer[ ucNextBufferToProcess ];

+	if( xDataLen != 0L )

+	{

+

+		/* The buffer pointed to by uip_buf is going to change.  Remember which

+		buffer uip_buf is currently pointing to. */

+		pucTemp = uip_buf;

+

+		/* Point uip_buf at the next buffer that contains data. */

+		uip_buf = pucEthernetBufferPointers[ ucNextBufferToProcess ];

+

+		/* The buffer pointed to by 

+		pucEthernetBufferPointeres[ ucNextBufferToProcess ] is now in use by

+		uip_buf, but the buffer uip_buf was pointing to on entry to this

+		function is free.  Set 

+		pucEthernetBufferPointeres[ ucNextBufferToProcess ] to the free 

+		buffer. */

+		pucEthernetBufferPointers[ ucNextBufferToProcess ] = pucTemp;

+		lLengthOfDataInBuffer[ ucNextBufferToProcess ] = 0L;

+

+		ucNextBufferToProcess++;

+		if( ucNextBufferToProcess >= archNUM_BUFFER_POINTERS )

+		{

+			ucNextBufferToProcess = 0L;

+		}

+	}

+

+	return xDataLen;

+}

+/*-----------------------------------------------------------*/

+

+BaseType_t xNetifInit( void )

+{

+BaseType_t x;

+pcap_if_t *pxAllNetworkInterfaces;

+

+	/* Allocate a free buffer to each buffer pointer. */

+	for( x = 0; x < sizeof( pucEthernetBufferPointers ) / sizeof( unsigned char * ); x++ )

+	{

+		pucEthernetBufferPointers[ x ] = &( ucEthernetBuffer[ x ][ 0 ] );

+	}

+

+	/* Start with uip_buf pointing to a buffer that is not referenced from the

+	pucEthernetBufferPointers[] array. */

+	uip_buf = &( ucEthernetBuffer[ archNUM_BUFFERS - 1 ][ 0 ] );

+

+	/* Query the computer the simulation is being executed on to find the 

+	network interfaces it has installed. */

+	pxAllNetworkInterfaces = prvPrintAvailableNetworkInterfaces();

+	

+	/* Open the network interface.  The number of the interface to be opened is 

+	set by the configNETWORK_INTERFACE_TO_USE constant in FreeRTOSConfig.h.

+	Calling this function will set the pxOpenedInterfaceHandle variable.  If,

+	after calling this function, pxOpenedInterfaceHandle is equal to NULL, then

+	the interface could not be opened. */

+	if( pxAllNetworkInterfaces != NULL )

+	{

+		prvOpenSelectedNetworkInterface( pxAllNetworkInterfaces );

+	}

+	

+

+	return x;

+}

+/*-----------------------------------------------------------*/

+

+static pcap_if_t * prvPrintAvailableNetworkInterfaces( void )

+{    

+pcap_if_t * pxAllNetworkInterfaces = NULL, *xInterface;

+long lInterfaceNumber = 1;

+

+    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, &pxAllNetworkInterfaces, cErrorBuffer ) == -1 )

+    {

+        printf( "\r\nCould not obtain a list of network interfaces\r\n%s\r\n", cErrorBuffer );

+        pxAllNetworkInterfaces = NULL;

+    }

+

+	if( pxAllNetworkInterfaces != NULL )

+	{

+		/* Print out the list of network interfaces.  The first in the list

+		is interface '1', not interface '0'. */

+		for( xInterface = pxAllNetworkInterfaces; xInterface != NULL; xInterface = xInterface->next )

+		{

+			printf( "%d. %s", lInterfaceNumber, xInterface->name );

+			

+			if( xInterface->description != NULL )

+			{

+				printf( " (%s)\r\n", xInterface->description );

+			}

+			else

+			{

+				printf( " (No description available)\r\n") ;

+			}

+			

+			lInterfaceNumber++;

+		}

+	}

+

+    if( lInterfaceNumber == 1 )

+    {

+		/* The interface number was never incremented, so the above for() loop

+		did not execute meaning no interfaces were found. */

+        printf( " \r\nNo network interfaces were found.\r\n" );

+        pxAllNetworkInterfaces = NULL;

+    }

+

+	printf( "\r\nThe interface that will be opened is set by configNETWORK_INTERFACE_TO_USE which should be defined in FreeRTOSConfig.h\r\n" );

+	printf( "Attempting to open interface number %d.\r\n", configNETWORK_INTERFACE_TO_USE );

+	

+    if( ( configNETWORK_INTERFACE_TO_USE < 1L ) || ( configNETWORK_INTERFACE_TO_USE > lInterfaceNumber ) )

+    {

+        printf("\r\nconfigNETWORK_INTERFACE_TO_USE is not in the valid range.\r\n" );

+		

+		if( pxAllNetworkInterfaces != NULL )

+		{

+			/* Free the device list, as no devices are going to be opened. */

+			pcap_freealldevs( pxAllNetworkInterfaces );

+			pxAllNetworkInterfaces = NULL;

+		}

+    }

+

+	return pxAllNetworkInterfaces;

+}

+/*-----------------------------------------------------------*/

+

+static void prvOpenSelectedNetworkInterface( pcap_if_t *pxAllNetworkInterfaces )

+{

+pcap_if_t *xInterface;

+long x;

+

+    /* Walk the list of devices until the selected device is located. */

+	xInterface = pxAllNetworkInterfaces;

+    for( x = 0L; x < ( configNETWORK_INTERFACE_TO_USE - 1L ); x++ )

+	{

+		xInterface = xInterface->next;

+	}

+

+    /* Open the selected interface. */

+	pxOpenedInterfaceHandle = pcap_open(	xInterface->name,          	/* The name of the selected interface. */

+											UIP_CONF_BUFFER_SIZE, 		/* The size of the packet to capture. */

+											PCAP_OPENFLAG_PROMISCUOUS,	/* Open in promiscious mode as the MAC and 

+																		IP address is going to be "simulated", and 

+																		not be the real MAC and IP address.  This allows

+																		trafic to the simulated IP address to be routed

+																		to uIP, and trafic to the real IP address to be

+																		routed to the Windows TCP/IP stack. */

+											0xfffffffL,             	/* The read time out.  This is going to block

+																		until data is available. */

+											NULL,             			/* No authentication is required as this is

+																		not a remote capture session. */

+											cErrorBuffer            

+									   );

+									   

+    if ( pxOpenedInterfaceHandle == NULL )

+    {

+        printf( "\r\n%s is not supported by WinPcap and cannot be opened\r\n", xInterface->name );

+    }

+	else

+	{

+		/* Configure the capture filter to allow blocking reads, and to filter 

+		out packets that are not of interest to this demo. */

+		prvConfigureCaptureBehaviour();

+	}

+

+	/* The device list is no longer required. */

+	pcap_freealldevs( pxAllNetworkInterfaces );

+}

+/*-----------------------------------------------------------*/

+

+static void prvConfigureCaptureBehaviour( void )

+{

+struct bpf_program xFilterCode;

+const long lMinBytesToCopy = 10L, lBlocking = 0L;

+unsigned long ulNetMask;

+

+	/* Unblock a read as soon as anything is received. */

+	pcap_setmintocopy( pxOpenedInterfaceHandle, lMinBytesToCopy );

+

+	/* Allow blocking. */

+	pcap_setnonblock( pxOpenedInterfaceHandle, lBlocking, cErrorBuffer );

+

+	/* Set up a filter so only the packets of interest are passed to the uIP

+	stack.  cErrorBuffer is used for convenience to create the string.  Don't

+	confuse this with an error message. */

+	sprintf( cErrorBuffer, "broadcast or multicast or host %d.%d.%d.%d", configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );

+

+	ulNetMask = ( configNET_MASK3 << 24UL ) | ( configNET_MASK2 << 16UL ) | ( configNET_MASK1 << 8L ) | configNET_MASK0;

+

+	if( pcap_compile(pxOpenedInterfaceHandle, &xFilterCode, cErrorBuffer, 1, ulNetMask ) < 0 )

+    {

+        printf("\r\nThe packet filter string is invalid\r\n" );

+    }

+	else

+	{    

+		if( pcap_setfilter( pxOpenedInterfaceHandle, &xFilterCode ) < 0 )

+		{

+			printf( "\r\nAn error occurred setting the packet filter.\r\n" );

+		}

+	}

+

+	/* Create a task that simulates an interrupt in a real system.  This will

+	block waiting for packets, then send a message to the uIP task when data

+	is available. */

+	xTaskCreate( prvInterruptSimulator, ( signed char * ) "MAC_ISR", configMINIMAL_STACK_SIZE, NULL, ( configuIP_TASK_PRIORITY - 1 ), NULL );

+}

+/*-----------------------------------------------------------*/

+

+static void prvInterruptSimulator( void *pvParameters )

+{

+static struct pcap_pkthdr *pxHeader;

+const unsigned char *pucPacketData;

+extern QueueHandle_t xEMACEventQueue;

+const unsigned long ulRxEvent = uipETHERNET_RX_EVENT;

+long lResult;

+

+	/* Just to kill the compiler warning. */

+	( void ) pvParameters;

+

+	for( ;; )

+	{

+		/* Get the next packet. */

+		lResult = pcap_next_ex( pxOpenedInterfaceHandle, &pxHeader, &pucPacketData );

+		if( lResult )

+		{

+			/* Is the next buffer into which data should be placed free? */

+			if( lLengthOfDataInBuffer[ ucNextBufferToFill ] == 0L )

+			{

+				/* Copy the data from the captured packet into the buffer. */

+				memcpy( pucEthernetBufferPointers[ ucNextBufferToFill ], pucPacketData, pxHeader->len );

+

+				/* Note the amount of data that was copied. */

+				lLengthOfDataInBuffer[ ucNextBufferToFill ] = pxHeader->len;

+

+				/* Move onto the next buffer, wrapping around if necessary. */

+				ucNextBufferToFill++;

+				if( ucNextBufferToFill >= archNUM_BUFFER_POINTERS )

+				{

+					ucNextBufferToFill = 0U;

+				}

+

+				/* Data was received and stored.  Send a message to the uIP task

+				to let it know. */

+				xQueueSendToBack( xEMACEventQueue, &ulRxEvent, portMAX_DELAY );

+			}

+		}

+	}

+}

+

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/bittypes.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/bittypes.h
new file mode 100644
index 0000000..fcacd45
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/bittypes.h
@@ -0,0 +1,137 @@
+/*

+ * Copyright (C) 1999 WIDE Project.

+ * All rights reserved.

+ * 

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. Neither the name of the project nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ * 

+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ */

+#ifndef _BITTYPES_H

+#define _BITTYPES_H

+

+#ifndef HAVE_U_INT8_T

+

+#if SIZEOF_CHAR == 1

+typedef unsigned char u_int8_t;

+typedef signed char _int8_t;

+#elif SIZEOF_INT == 1

+typedef unsigned int u_int8_t;

+typedef signed int int8_t;

+#else  /* XXX */

+#error "there's no appropriate type for u_int8_t"

+#endif

+#define HAVE_U_INT8_T 1

+#define HAVE_INT8_T 1

+

+#endif /* HAVE_U_INT8_T */

+

+#ifndef HAVE_U_INT16_T 

+

+#if SIZEOF_SHORT == 2

+typedef unsigned short u_int16_t;

+typedef signed short _int16_t;

+#elif SIZEOF_INT == 2

+typedef unsigned int u_int16_t;

+typedef signed int int16_t;

+#elif SIZEOF_CHAR == 2

+typedef unsigned char u_int16_t;

+typedef signed char int16_t;

+#else  /* XXX */

+#error "there's no appropriate type for u_int16_t"

+#endif

+#define HAVE_U_INT16_T 1

+#define HAVE_INT16_T 1

+

+#endif /* HAVE_U_INT16_T */

+

+#ifndef HAVE_U_INT32_T

+

+#if SIZEOF_INT == 4

+typedef unsigned int u_int32_t;

+typedef signed int _int32_t;

+#elif SIZEOF_LONG == 4

+typedef unsigned long u_int32_t;

+typedef signed long int32_t;

+#elif SIZEOF_SHORT == 4

+typedef unsigned short u_int32_t;

+typedef signed short int32_t;

+#else  /* XXX */

+#error "there's no appropriate type for u_int32_t"

+#endif

+#define HAVE_U_INT32_T 1

+#define HAVE_INT32_T 1

+

+#endif /* HAVE_U_INT32_T */

+

+#ifndef HAVE_U_INT64_T

+#if SIZEOF_LONG_LONG == 8

+typedef unsigned long long u_int64_t;

+typedef long long int64_t;

+#elif defined(_MSC_EXTENSIONS)

+typedef unsigned _int64 u_int64_t;

+typedef _int64 int64_t;

+#elif SIZEOF_INT == 8

+typedef unsigned int u_int64_t;

+#elif SIZEOF_LONG == 8

+typedef unsigned long u_int64_t;

+#elif SIZEOF_SHORT == 8

+typedef unsigned short u_int64_t;

+#else  /* XXX */

+#error "there's no appropriate type for u_int64_t"

+#endif

+

+#endif /* HAVE_U_INT64_T */

+

+#ifndef PRId64

+#ifdef _MSC_EXTENSIONS

+#define PRId64	"I64d"

+#else /* _MSC_EXTENSIONS */

+#define PRId64	"lld"

+#endif /* _MSC_EXTENSIONS */

+#endif /* PRId64 */

+

+#ifndef PRIo64

+#ifdef _MSC_EXTENSIONS

+#define PRIo64	"I64o"

+#else /* _MSC_EXTENSIONS */

+#define PRIo64	"llo"

+#endif /* _MSC_EXTENSIONS */

+#endif /* PRIo64 */

+

+#ifndef PRIx64

+#ifdef _MSC_EXTENSIONS

+#define PRIx64	"I64x"

+#else /* _MSC_EXTENSIONS */

+#define PRIx64	"llx"

+#endif /* _MSC_EXTENSIONS */

+#endif /* PRIx64 */

+

+#ifndef PRIu64

+#ifdef _MSC_EXTENSIONS

+#define PRIu64	"I64u"

+#else /* _MSC_EXTENSIONS */

+#define PRIu64	"llu"

+#endif /* _MSC_EXTENSIONS */

+#endif /* PRIu64 */

+

+#endif /* _BITTYPES_H */

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/ip6_misc.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/ip6_misc.h
new file mode 100644
index 0000000..96822d0
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/ip6_misc.h
@@ -0,0 +1,163 @@
+/*

+ * Copyright (c) 1993, 1994, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that: (1) source code distributions

+ * retain the above copyright notice and this paragraph in its entirety, (2)

+ * distributions including binary code include the above copyright notice and

+ * this paragraph in its entirety in the documentation or other materials

+ * provided with the distribution, and (3) all advertising materials mentioning

+ * features or use of this software display the following acknowledgement:

+ * ``This product includes software developed by the University of California,

+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of

+ * the University nor the names of its contributors may be used to endorse

+ * or promote products derived from this software without specific prior

+ * written permission.

+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED

+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF

+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/Win32/Include/ip6_misc.h,v 1.5 2006-01-22 18:02:18 gianluca Exp $ (LBL)

+ */

+

+/*

+ * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows

+ */

+

+#include <winsock2.h>

+

+#include <ws2tcpip.h>

+

+#ifndef __MINGW32__

+#define	IN_MULTICAST(a)		IN_CLASSD(a)

+#endif

+

+#define	IN_EXPERIMENTAL(a)	((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000)

+

+#define	IN_LOOPBACKNET		127

+

+#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)

+/* IPv6 address */

+struct in6_addr

+  {

+    union

+      {

+	u_int8_t		u6_addr8[16];

+	u_int16_t	u6_addr16[8];

+	u_int32_t	u6_addr32[4];

+      } in6_u;

+#define s6_addr			in6_u.u6_addr8

+#define s6_addr16		in6_u.u6_addr16

+#define s6_addr32		in6_u.u6_addr32

+#define s6_addr64		in6_u.u6_addr64

+  };

+

+#define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }

+#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }

+#endif /* __MINGW32__ */

+

+

+#if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF))

+typedef unsigned short	sa_family_t;

+#endif

+

+

+#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)

+

+#define	__SOCKADDR_COMMON(sa_prefix) \

+  sa_family_t sa_prefix##family

+

+/* Ditto, for IPv6.  */

+struct sockaddr_in6

+  {

+    __SOCKADDR_COMMON (sin6_);

+    u_int16_t sin6_port;		/* Transport layer port # */

+    u_int32_t sin6_flowinfo;	/* IPv6 flow information */

+    struct in6_addr sin6_addr;	/* IPv6 address */

+  };

+

+#define IN6_IS_ADDR_V4MAPPED(a) \

+	((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \

+	 (((u_int32_t *) (a))[2] == htonl (0xffff)))

+

+#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff)

+

+#define IN6_IS_ADDR_LINKLOCAL(a) \

+	((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000))

+

+#define IN6_IS_ADDR_LOOPBACK(a) \

+	(((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \

+	 ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1))

+#endif /* __MINGW32__ */

+

+#define ip6_vfc   ip6_ctlun.ip6_un2_vfc

+#define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow

+#define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen

+#define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt

+#define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim

+#define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim

+

+#define nd_rd_type               nd_rd_hdr.icmp6_type

+#define nd_rd_code               nd_rd_hdr.icmp6_code

+#define nd_rd_cksum              nd_rd_hdr.icmp6_cksum

+#define nd_rd_reserved           nd_rd_hdr.icmp6_data32[0]

+

+/*

+ *	IPV6 extension headers

+ */

+#define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/

+#define IPPROTO_IPV6		41  /* IPv6 header.  */

+#define IPPROTO_ROUTING		43	/* IPv6 routing header		*/

+#define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/

+#define IPPROTO_ESP		50	/* encapsulating security payload */

+#define IPPROTO_AH		51	/* authentication header	*/

+#define IPPROTO_ICMPV6		58	/* ICMPv6			*/

+#define IPPROTO_NONE		59	/* IPv6 no next header		*/

+#define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/

+#define IPPROTO_PIM			103 /* Protocol Independent Multicast.  */

+

+#define	 IPV6_RTHDR_TYPE_0 0

+

+/* Option types and related macros */

+#define IP6OPT_PAD1		0x00	/* 00 0 00000 */

+#define IP6OPT_PADN		0x01	/* 00 0 00001 */

+#define IP6OPT_JUMBO		0xC2	/* 11 0 00010 = 194 */

+#define IP6OPT_JUMBO_LEN	6

+#define IP6OPT_ROUTER_ALERT	0x05	/* 00 0 00101 */

+

+#define IP6OPT_RTALERT_LEN	4

+#define IP6OPT_RTALERT_MLD	0	/* Datagram contains an MLD message */

+#define IP6OPT_RTALERT_RSVP	1	/* Datagram contains an RSVP message */

+#define IP6OPT_RTALERT_ACTNET	2 	/* contains an Active Networks msg */

+#define IP6OPT_MINLEN		2

+

+#define IP6OPT_BINDING_UPDATE	0xc6	/* 11 0 00110 */

+#define IP6OPT_BINDING_ACK	0x07	/* 00 0 00111 */

+#define IP6OPT_BINDING_REQ	0x08	/* 00 0 01000 */

+#define IP6OPT_HOME_ADDRESS	0xc9	/* 11 0 01001 */

+#define IP6OPT_EID		0x8a	/* 10 0 01010 */

+

+#define IP6OPT_TYPE(o)		((o) & 0xC0)

+#define IP6OPT_TYPE_SKIP	0x00

+#define IP6OPT_TYPE_DISCARD	0x40

+#define IP6OPT_TYPE_FORCEICMP	0x80

+#define IP6OPT_TYPE_ICMP	0xC0

+

+#define IP6OPT_MUTABLE		0x20

+

+

+#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)

+#ifndef EAI_ADDRFAMILY

+struct addrinfo {

+	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */

+	int	ai_family;	/* PF_xxx */

+	int	ai_socktype;	/* SOCK_xxx */

+	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */

+	size_t	ai_addrlen;	/* length of ai_addr */

+	char	*ai_canonname;	/* canonical name for hostname */

+	struct sockaddr *ai_addr;	/* binary address */

+	struct addrinfo *ai_next;	/* next structure in linked list */

+};

+#endif

+#endif /* __MINGW32__ */

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/netif.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/netif.h
new file mode 100644
index 0000000..2d51478
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/netif.h
@@ -0,0 +1,52 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+#ifndef NET_IF_H

+#define NET_IF_H

+

+/*

+ * Send uip_len bytes from uip_buf to the network interface selected by the 

+ * configNETWORK_INTERFACE_TO_USE constant (defined in FreeRTOSConfig.h). 

+ */

+void vNetifTx( void );

+

+/*

+ * Receive bytes from the network interface selected by the 

+ * configNETWORK_INTERFACE_TO_USE constant (defined in FreeRTOSConfig.h).  The

+ * bytes are placed in uip_buf.  The number of bytes copied into uip_buf is

+ * returned.

+ */

+UBaseType_t uxNetifRx( void );

+

+/*

+ * Prepare a packet capture session.  This will print out all the network 

+ * interfaces available, and the one actually used is set by the 

+ * configNETWORK_INTERFACE_TO_USE constant that is defined in 

+ * FreeRTOSConfig.h. */

+BaseType_t xNetifInit( void );

+

+#endif /* NET_IF_H */

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-bpf.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-bpf.h
new file mode 100644
index 0000000..ff5b6e0
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-bpf.h
@@ -0,0 +1,47 @@
+/*-

+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * This code is derived from the Stanford/CMU enet packet filter,

+ * (net/enet.c) distributed as part of 4.3BSD, and code contributed

+ * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 

+ * Berkeley Laboratory.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *      This product includes software developed by the University of

+ *      California, Berkeley and its contributors.

+ * 4. Neither the name of the University nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap-bpf.h,v 1.50 2007/04/01 21:43:55 guy Exp $ (LBL)

+ */

+

+/*

+ * For backwards compatibility.

+ *

+ * Note to OS vendors: do NOT get rid of this file!  Some applications

+ * might expect to be able to include <pcap-bpf.h>.

+ */

+#include <pcap/bpf.h>

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-namedb.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-namedb.h
new file mode 100644
index 0000000..ee6715f
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-namedb.h
@@ -0,0 +1,42 @@
+/*

+ * Copyright (c) 1994, 1996

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *	This product includes software developed by the Computer Systems

+ *	Engineering Group at Lawrence Berkeley Laboratory.

+ * 4. Neither the name of the University nor of the Laboratory may be used

+ *    to endorse or promote products derived from this software without

+ *    specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap-namedb.h,v 1.13 2006/10/04 18:13:32 guy Exp $ (LBL)

+ */

+

+/*

+ * For backwards compatibility.

+ *

+ * Note to OS vendors: do NOT get rid of this file!  Some applications

+ * might expect to be able to include <pcap-namedb.h>.

+ */

+#include <pcap/namedb.h>

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-stdinc.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-stdinc.h
new file mode 100644
index 0000000..cbd62d1
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap-stdinc.h
@@ -0,0 +1,93 @@
+/*

+ * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy)

+ * Copyright (c) 2005 - 2009 CACE Technologies, Inc. Davis (California)

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ *

+ * 1. Redistributions of source code must retain the above copyright

+ * notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ * notice, this list of conditions and the following disclaimer in the

+ * documentation and/or other materials provided with the distribution.

+ * 3. Neither the name of the Politecnico di Torino nor the names of its

+ * contributors may be used to endorse or promote products derived from

+ * this software without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap-stdinc.h,v 1.10.2.1 2008-10-06 15:38:39 gianluca Exp $ (LBL)

+ */

+

+#define SIZEOF_CHAR 1

+#define SIZEOF_SHORT 2

+#define SIZEOF_INT 4

+#ifndef _MSC_EXTENSIONS

+#define SIZEOF_LONG_LONG 8

+#endif

+

+/*

+ * Avoids a compiler warning in case this was already defined      

+ * (someone defined _WINSOCKAPI_ when including 'windows.h', in order

+ * to prevent it from including 'winsock.h')

+ */

+#ifdef _WINSOCKAPI_

+#undef _WINSOCKAPI_

+#endif

+#include <winsock2.h>

+

+#include <fcntl.h>

+

+#include "bittypes.h"

+#include <time.h>

+#include <io.h>

+

+#ifndef __MINGW32__

+#include "IP6_misc.h"

+#endif

+

+#define caddr_t char*

+

+#if _MSC_VER < 1500

+#define snprintf _snprintf

+#define vsnprintf _vsnprintf

+#define strdup _strdup

+#endif

+

+#define inline __inline 

+

+#ifdef __MINGW32__

+#include <stdint.h>

+#else /*__MINGW32__*/

+/* MSVC compiler */

+#ifndef _UINTPTR_T_DEFINED

+#ifdef  _WIN64

+typedef unsigned __int64    uintptr_t;

+#else

+typedef _W64 unsigned int   uintptr_t;

+#endif

+#define _UINTPTR_T_DEFINED

+#endif

+

+#ifndef _INTPTR_T_DEFINED

+#ifdef  _WIN64

+typedef __int64    intptr_t;

+#else

+typedef _W64 int   intptr_t;

+#endif

+#define _INTPTR_T_DEFINED

+#endif 

+

+#endif /*__MINGW32__*/

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap.h
new file mode 100644
index 0000000..2eea075
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap.h
@@ -0,0 +1,45 @@
+/*

+ * Copyright (c) 1993, 1994, 1995, 1996, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *	This product includes software developed by the Computer Systems

+ *	Engineering Group at Lawrence Berkeley Laboratory.

+ * 4. Neither the name of the University nor of the Laboratory may be used

+ *    to endorse or promote products derived from this software without

+ *    specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.59 2006/10/04 18:09:22 guy Exp $ (LBL)

+ */

+

+/*

+ * For backwards compatibility.

+ *

+ * Note to OS vendors: do NOT get rid of this file!  Many applications

+ * expect to be able to include <pcap.h>, and at least some of them

+ * go through contortions in their configure scripts to try to detect

+ * OSes that have "helpfully" moved pcap.h to <pcap/pcap.h> without

+ * leaving behind a <pcap.h> file.

+ */

+#include <pcap/pcap.h>

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/bluetooth.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/bluetooth.h
new file mode 100644
index 0000000..28b991f
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/bluetooth.h
@@ -0,0 +1,48 @@
+/*

+ * Copyright (c) 2006 Paolo Abeni (Italy)

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ *

+ * 1. Redistributions of source code must retain the above copyright

+ * notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ * notice, this list of conditions and the following disclaimer in the

+ * documentation and/or other materials provided with the distribution.

+ * 3. The name of the author may not be used to endorse or promote 

+ * products derived from this software without specific prior written 

+ * permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ *

+ * bluetooth data struct

+ * By Paolo Abeni <paolo.abeni@email.it>

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/bluetooth.h,v 1.1 2007/09/22 02:10:17 guy Exp $

+ */

+ 

+#ifndef _PCAP_BLUETOOTH_STRUCTS_H__

+#define _PCAP_BLUETOOTH_STRUCTS_H__

+

+/*

+ * Header prepended libpcap to each bluetooth h:4 frame.

+ * fields are in network byte order

+ */

+typedef struct _pcap_bluetooth_h4_header {

+	u_int32_t direction; /* if first bit is set direction is incoming */

+} pcap_bluetooth_h4_header;

+

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/bpf.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/bpf.h
new file mode 100644
index 0000000..b6d2596
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/bpf.h
@@ -0,0 +1,934 @@
+/*-

+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * This code is derived from the Stanford/CMU enet packet filter,

+ * (net/enet.c) distributed as part of 4.3BSD, and code contributed

+ * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 

+ * Berkeley Laboratory.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *      This product includes software developed by the University of

+ *      California, Berkeley and its contributors.

+ * 4. Neither the name of the University nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ *      @(#)bpf.h       7.1 (Berkeley) 5/7/91

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/bpf.h,v 1.19.2.8 2008-09-22 20:16:01 guy Exp $ (LBL)

+ */

+

+/*

+ * This is libpcap's cut-down version of bpf.h; it includes only

+ * the stuff needed for the code generator and the userland BPF

+ * interpreter, and the libpcap APIs for setting filters, etc..

+ *

+ * "pcap-bpf.c" will include the native OS version, as it deals with

+ * the OS's BPF implementation.

+ *

+ * XXX - should this all just be moved to "pcap.h"?

+ */

+

+#ifndef BPF_MAJOR_VERSION

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* BSD style release date */

+#define BPF_RELEASE 199606

+

+#ifdef MSDOS /* must be 32-bit */

+typedef long          bpf_int32;

+typedef unsigned long bpf_u_int32;

+#else

+typedef	int bpf_int32;

+typedef	u_int bpf_u_int32;

+#endif

+

+/*

+ * Alignment macros.  BPF_WORDALIGN rounds up to the next 

+ * even multiple of BPF_ALIGNMENT. 

+ */

+#ifndef __NetBSD__

+#define BPF_ALIGNMENT sizeof(bpf_int32)

+#else

+#define BPF_ALIGNMENT sizeof(long)

+#endif

+#define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))

+

+#define BPF_MAXBUFSIZE 0x8000

+#define BPF_MINBUFSIZE 32

+

+/*

+ * Structure for "pcap_compile()", "pcap_setfilter()", etc..

+ */

+struct bpf_program {

+	u_int bf_len;

+	struct bpf_insn *bf_insns;

+};

+ 

+/*

+ * Struct return by BIOCVERSION.  This represents the version number of 

+ * the filter language described by the instruction encodings below.

+ * bpf understands a program iff kernel_major == filter_major &&

+ * kernel_minor >= filter_minor, that is, if the value returned by the

+ * running kernel has the same major number and a minor number equal

+ * equal to or less than the filter being downloaded.  Otherwise, the

+ * results are undefined, meaning an error may be returned or packets

+ * may be accepted haphazardly.

+ * It has nothing to do with the source code version.

+ */

+struct bpf_version {

+	u_short bv_major;

+	u_short bv_minor;

+};

+/* Current version number of filter architecture. */

+#define BPF_MAJOR_VERSION 1

+#define BPF_MINOR_VERSION 1

+

+/*

+ * Data-link level type codes.

+ *

+ * Do *NOT* add new values to this list without asking

+ * "tcpdump-workers@lists.tcpdump.org" for a value.  Otherwise, you run

+ * the risk of using a value that's already being used for some other

+ * purpose, and of having tools that read libpcap-format captures not

+ * being able to handle captures with your new DLT_ value, with no hope

+ * that they will ever be changed to do so (as that would destroy their

+ * ability to read captures using that value for that other purpose).

+ */

+

+/*

+ * These are the types that are the same on all platforms, and that

+ * have been defined by <net/bpf.h> for ages.

+ */

+#define DLT_NULL	0	/* BSD loopback encapsulation */

+#define DLT_EN10MB	1	/* Ethernet (10Mb) */

+#define DLT_EN3MB	2	/* Experimental Ethernet (3Mb) */

+#define DLT_AX25	3	/* Amateur Radio AX.25 */

+#define DLT_PRONET	4	/* Proteon ProNET Token Ring */

+#define DLT_CHAOS	5	/* Chaos */

+#define DLT_IEEE802	6	/* 802.5 Token Ring */

+#define DLT_ARCNET	7	/* ARCNET, with BSD-style header */

+#define DLT_SLIP	8	/* Serial Line IP */

+#define DLT_PPP		9	/* Point-to-point Protocol */

+#define DLT_FDDI	10	/* FDDI */

+

+/*

+ * These are types that are different on some platforms, and that

+ * have been defined by <net/bpf.h> for ages.  We use #ifdefs to

+ * detect the BSDs that define them differently from the traditional

+ * libpcap <net/bpf.h>

+ *

+ * XXX - DLT_ATM_RFC1483 is 13 in BSD/OS, and DLT_RAW is 14 in BSD/OS,

+ * but I don't know what the right #define is for BSD/OS.

+ */

+#define DLT_ATM_RFC1483	11	/* LLC-encapsulated ATM */

+

+#ifdef __OpenBSD__

+#define DLT_RAW		14	/* raw IP */

+#else

+#define DLT_RAW		12	/* raw IP */

+#endif

+

+/*

+ * Given that the only OS that currently generates BSD/OS SLIP or PPP

+ * is, well, BSD/OS, arguably everybody should have chosen its values

+ * for DLT_SLIP_BSDOS and DLT_PPP_BSDOS, which are 15 and 16, but they

+ * didn't.  So it goes.

+ */

+#if defined(__NetBSD__) || defined(__FreeBSD__)

+#ifndef DLT_SLIP_BSDOS

+#define DLT_SLIP_BSDOS	13	/* BSD/OS Serial Line IP */

+#define DLT_PPP_BSDOS	14	/* BSD/OS Point-to-point Protocol */

+#endif

+#else

+#define DLT_SLIP_BSDOS	15	/* BSD/OS Serial Line IP */

+#define DLT_PPP_BSDOS	16	/* BSD/OS Point-to-point Protocol */

+#endif

+

+/*

+ * 17 is used for DLT_OLD_PFLOG in OpenBSD;

+ *     OBSOLETE: DLT_PFLOG is 117 in OpenBSD now as well. See below.

+ * 18 is used for DLT_PFSYNC in OpenBSD; don't use it for anything else.

+ */

+

+#define DLT_ATM_CLIP	19	/* Linux Classical-IP over ATM */

+

+/*

+ * Apparently Redback uses this for its SmartEdge 400/800.  I hope

+ * nobody else decided to use it, too.

+ */

+#define DLT_REDBACK_SMARTEDGE	32

+

+/*

+ * These values are defined by NetBSD; other platforms should refrain from

+ * using them for other purposes, so that NetBSD savefiles with link

+ * types of 50 or 51 can be read as this type on all platforms.

+ */

+#define DLT_PPP_SERIAL	50	/* PPP over serial with HDLC encapsulation */

+#define DLT_PPP_ETHER	51	/* PPP over Ethernet */

+

+/*

+ * The Axent Raptor firewall - now the Symantec Enterprise Firewall - uses

+ * a link-layer type of 99 for the tcpdump it supplies.  The link-layer

+ * header has 6 bytes of unknown data, something that appears to be an

+ * Ethernet type, and 36 bytes that appear to be 0 in at least one capture

+ * I've seen.

+ */

+#define DLT_SYMANTEC_FIREWALL	99

+

+/*

+ * Values between 100 and 103 are used in capture file headers as

+ * link-layer types corresponding to DLT_ types that differ

+ * between platforms; don't use those values for new DLT_ new types.

+ */

+

+/*

+ * This value was defined by libpcap 0.5; platforms that have defined

+ * it with a different value should define it here with that value -

+ * a link type of 104 in a save file will be mapped to DLT_C_HDLC,

+ * whatever value that happens to be, so programs will correctly

+ * handle files with that link type regardless of the value of

+ * DLT_C_HDLC.

+ *

+ * The name DLT_C_HDLC was used by BSD/OS; we use that name for source

+ * compatibility with programs written for BSD/OS.

+ *

+ * libpcap 0.5 defined it as DLT_CHDLC; we define DLT_CHDLC as well,

+ * for source compatibility with programs written for libpcap 0.5.

+ */

+#define DLT_C_HDLC	104	/* Cisco HDLC */

+#define DLT_CHDLC	DLT_C_HDLC

+

+#define DLT_IEEE802_11	105	/* IEEE 802.11 wireless */

+

+/*

+ * 106 is reserved for Linux Classical IP over ATM; it's like DLT_RAW,

+ * except when it isn't.  (I.e., sometimes it's just raw IP, and

+ * sometimes it isn't.)  We currently handle it as DLT_LINUX_SLL,

+ * so that we don't have to worry about the link-layer header.)

+ */

+

+/*

+ * Frame Relay; BSD/OS has a DLT_FR with a value of 11, but that collides

+ * with other values.

+ * DLT_FR and DLT_FRELAY packets start with the Q.922 Frame Relay header

+ * (DLCI, etc.).

+ */

+#define DLT_FRELAY	107

+

+/*

+ * OpenBSD DLT_LOOP, for loopback devices; it's like DLT_NULL, except

+ * that the AF_ type in the link-layer header is in network byte order.

+ *

+ * DLT_LOOP is 12 in OpenBSD, but that's DLT_RAW in other OSes, so

+ * we don't use 12 for it in OSes other than OpenBSD.

+ */

+#ifdef __OpenBSD__

+#define DLT_LOOP	12

+#else

+#define DLT_LOOP	108

+#endif

+

+/*

+ * Encapsulated packets for IPsec; DLT_ENC is 13 in OpenBSD, but that's

+ * DLT_SLIP_BSDOS in NetBSD, so we don't use 13 for it in OSes other

+ * than OpenBSD.

+ */

+#ifdef __OpenBSD__

+#define DLT_ENC		13

+#else

+#define DLT_ENC		109

+#endif

+

+/*

+ * Values between 110 and 112 are reserved for use in capture file headers

+ * as link-layer types corresponding to DLT_ types that might differ

+ * between platforms; don't use those values for new DLT_ types

+ * other than the corresponding DLT_ types.

+ */

+

+/*

+ * This is for Linux cooked sockets.

+ */

+#define DLT_LINUX_SLL	113

+

+/*

+ * Apple LocalTalk hardware.

+ */

+#define DLT_LTALK	114

+

+/*

+ * Acorn Econet.

+ */

+#define DLT_ECONET	115

+

+/*

+ * Reserved for use with OpenBSD ipfilter.

+ */

+#define DLT_IPFILTER	116

+

+/*

+ * OpenBSD DLT_PFLOG; DLT_PFLOG is 17 in OpenBSD, but that's DLT_LANE8023

+ * in SuSE 6.3, so we can't use 17 for it in capture-file headers.

+ *

+ * XXX: is there a conflict with DLT_PFSYNC 18 as well?

+ */

+#ifdef __OpenBSD__

+#define DLT_OLD_PFLOG	17

+#define DLT_PFSYNC	18

+#endif

+#define DLT_PFLOG	117

+

+/*

+ * Registered for Cisco-internal use.

+ */

+#define DLT_CISCO_IOS	118

+

+/*

+ * For 802.11 cards using the Prism II chips, with a link-layer

+ * header including Prism monitor mode information plus an 802.11

+ * header.

+ */

+#define DLT_PRISM_HEADER	119

+

+/*

+ * Reserved for Aironet 802.11 cards, with an Aironet link-layer header

+ * (see Doug Ambrisko's FreeBSD patches).

+ */

+#define DLT_AIRONET_HEADER	120

+

+/*

+ * Reserved for Siemens HiPath HDLC.

+ */

+#define DLT_HHDLC		121

+

+/*

+ * This is for RFC 2625 IP-over-Fibre Channel.

+ *

+ * This is not for use with raw Fibre Channel, where the link-layer

+ * header starts with a Fibre Channel frame header; it's for IP-over-FC,

+ * where the link-layer header starts with an RFC 2625 Network_Header

+ * field.

+ */

+#define DLT_IP_OVER_FC		122

+

+/*

+ * This is for Full Frontal ATM on Solaris with SunATM, with a

+ * pseudo-header followed by an AALn PDU.

+ *

+ * There may be other forms of Full Frontal ATM on other OSes,

+ * with different pseudo-headers.

+ *

+ * If ATM software returns a pseudo-header with VPI/VCI information

+ * (and, ideally, packet type information, e.g. signalling, ILMI,

+ * LANE, LLC-multiplexed traffic, etc.), it should not use

+ * DLT_ATM_RFC1483, but should get a new DLT_ value, so tcpdump

+ * and the like don't have to infer the presence or absence of a

+ * pseudo-header and the form of the pseudo-header.

+ */

+#define DLT_SUNATM		123	/* Solaris+SunATM */

+

+/* 

+ * Reserved as per request from Kent Dahlgren <kent@praesum.com>

+ * for private use.

+ */

+#define DLT_RIO                 124     /* RapidIO */

+#define DLT_PCI_EXP             125     /* PCI Express */

+#define DLT_AURORA              126     /* Xilinx Aurora link layer */

+

+/*

+ * Header for 802.11 plus a number of bits of link-layer information

+ * including radio information, used by some recent BSD drivers as

+ * well as the madwifi Atheros driver for Linux.

+ */

+#define DLT_IEEE802_11_RADIO	127	/* 802.11 plus radiotap radio header */

+

+/*

+ * Reserved for the TZSP encapsulation, as per request from

+ * Chris Waters <chris.waters@networkchemistry.com>

+ * TZSP is a generic encapsulation for any other link type,

+ * which includes a means to include meta-information

+ * with the packet, e.g. signal strength and channel

+ * for 802.11 packets.

+ */

+#define DLT_TZSP                128     /* Tazmen Sniffer Protocol */

+

+/*

+ * BSD's ARCNET headers have the source host, destination host,

+ * and type at the beginning of the packet; that's what's handed

+ * up to userland via BPF.

+ *

+ * Linux's ARCNET headers, however, have a 2-byte offset field

+ * between the host IDs and the type; that's what's handed up

+ * to userland via PF_PACKET sockets.

+ *

+ * We therefore have to have separate DLT_ values for them.

+ */

+#define DLT_ARCNET_LINUX	129	/* ARCNET */

+

+/*

+ * Juniper-private data link types, as per request from

+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used

+ * for passing on chassis-internal metainformation such as

+ * QOS profiles, etc..

+ */

+#define DLT_JUNIPER_MLPPP       130

+#define DLT_JUNIPER_MLFR        131

+#define DLT_JUNIPER_ES          132

+#define DLT_JUNIPER_GGSN        133

+#define DLT_JUNIPER_MFR         134

+#define DLT_JUNIPER_ATM2        135

+#define DLT_JUNIPER_SERVICES    136

+#define DLT_JUNIPER_ATM1        137

+

+/*

+ * Apple IP-over-IEEE 1394, as per a request from Dieter Siegmund

+ * <dieter@apple.com>.  The header that's presented is an Ethernet-like

+ * header:

+ *

+ *	#define FIREWIRE_EUI64_LEN	8

+ *	struct firewire_header {

+ *		u_char  firewire_dhost[FIREWIRE_EUI64_LEN];

+ *		u_char  firewire_shost[FIREWIRE_EUI64_LEN];

+ *		u_short firewire_type;

+ *	};

+ *

+ * with "firewire_type" being an Ethernet type value, rather than,

+ * for example, raw GASP frames being handed up.

+ */

+#define DLT_APPLE_IP_OVER_IEEE1394	138

+

+/*

+ * Various SS7 encapsulations, as per a request from Jeff Morriss

+ * <jeff.morriss[AT]ulticom.com> and subsequent discussions.

+ */

+#define DLT_MTP2_WITH_PHDR	139	/* pseudo-header with various info, followed by MTP2 */

+#define DLT_MTP2		140	/* MTP2, without pseudo-header */

+#define DLT_MTP3		141	/* MTP3, without pseudo-header or MTP2 */

+#define DLT_SCCP		142	/* SCCP, without pseudo-header or MTP2 or MTP3 */

+

+/*

+ * DOCSIS MAC frames.

+ */

+#define DLT_DOCSIS		143

+

+/*

+ * Linux-IrDA packets. Protocol defined at http://www.irda.org.

+ * Those packets include IrLAP headers and above (IrLMP...), but

+ * don't include Phy framing (SOF/EOF/CRC & byte stuffing), because Phy

+ * framing can be handled by the hardware and depend on the bitrate.

+ * This is exactly the format you would get capturing on a Linux-IrDA

+ * interface (irdaX), but not on a raw serial port.

+ * Note the capture is done in "Linux-cooked" mode, so each packet include

+ * a fake packet header (struct sll_header). This is because IrDA packet

+ * decoding is dependant on the direction of the packet (incomming or

+ * outgoing).

+ * When/if other platform implement IrDA capture, we may revisit the

+ * issue and define a real DLT_IRDA...

+ * Jean II

+ */

+#define DLT_LINUX_IRDA		144

+

+/*

+ * Reserved for IBM SP switch and IBM Next Federation switch.

+ */

+#define DLT_IBM_SP		145

+#define DLT_IBM_SN		146

+

+/*

+ * Reserved for private use.  If you have some link-layer header type

+ * that you want to use within your organization, with the capture files

+ * using that link-layer header type not ever be sent outside your

+ * organization, you can use these values.

+ *

+ * No libpcap release will use these for any purpose, nor will any

+ * tcpdump release use them, either.

+ *

+ * Do *NOT* use these in capture files that you expect anybody not using

+ * your private versions of capture-file-reading tools to read; in

+ * particular, do *NOT* use them in products, otherwise you may find that

+ * people won't be able to use tcpdump, or snort, or Ethereal, or... to

+ * read capture files from your firewall/intrusion detection/traffic

+ * monitoring/etc. appliance, or whatever product uses that DLT_ value,

+ * and you may also find that the developers of those applications will

+ * not accept patches to let them read those files.

+ *

+ * Also, do not use them if somebody might send you a capture using them

+ * for *their* private type and tools using them for *your* private type

+ * would have to read them.

+ *

+ * Instead, ask "tcpdump-workers@lists.tcpdump.org" for a new DLT_ value,

+ * as per the comment above, and use the type you're given.

+ */

+#define DLT_USER0		147

+#define DLT_USER1		148

+#define DLT_USER2		149

+#define DLT_USER3		150

+#define DLT_USER4		151

+#define DLT_USER5		152

+#define DLT_USER6		153

+#define DLT_USER7		154

+#define DLT_USER8		155

+#define DLT_USER9		156

+#define DLT_USER10		157

+#define DLT_USER11		158

+#define DLT_USER12		159

+#define DLT_USER13		160

+#define DLT_USER14		161

+#define DLT_USER15		162

+

+/*

+ * For future use with 802.11 captures - defined by AbsoluteValue

+ * Systems to store a number of bits of link-layer information

+ * including radio information:

+ *

+ *	http://www.shaftnet.org/~pizza/software/capturefrm.txt

+ *

+ * but it might be used by some non-AVS drivers now or in the

+ * future.

+ */

+#define DLT_IEEE802_11_RADIO_AVS 163	/* 802.11 plus AVS radio header */

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used

+ * for passing on chassis-internal metainformation such as

+ * QOS profiles, etc..

+ */

+#define DLT_JUNIPER_MONITOR     164

+

+/*

+ * Reserved for BACnet MS/TP.

+ */

+#define DLT_BACNET_MS_TP	165

+

+/*

+ * Another PPP variant as per request from Karsten Keil <kkeil@suse.de>.

+ *

+ * This is used in some OSes to allow a kernel socket filter to distinguish

+ * between incoming and outgoing packets, on a socket intended to

+ * supply pppd with outgoing packets so it can do dial-on-demand and

+ * hangup-on-lack-of-demand; incoming packets are filtered out so they

+ * don't cause pppd to hold the connection up (you don't want random

+ * input packets such as port scans, packets from old lost connections,

+ * etc. to force the connection to stay up).

+ *

+ * The first byte of the PPP header (0xff03) is modified to accomodate

+ * the direction - 0x00 = IN, 0x01 = OUT.

+ */

+#define DLT_PPP_PPPD		166

+

+/*

+ * Names for backwards compatibility with older versions of some PPP

+ * software; new software should use DLT_PPP_PPPD.

+ */

+#define DLT_PPP_WITH_DIRECTION	DLT_PPP_PPPD

+#define DLT_LINUX_PPP_WITHDIRECTION	DLT_PPP_PPPD

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used

+ * for passing on chassis-internal metainformation such as

+ * QOS profiles, cookies, etc..

+ */

+#define DLT_JUNIPER_PPPOE       167

+#define DLT_JUNIPER_PPPOE_ATM   168

+

+#define DLT_GPRS_LLC		169	/* GPRS LLC */

+#define DLT_GPF_T		170	/* GPF-T (ITU-T G.7041/Y.1303) */

+#define DLT_GPF_F		171	/* GPF-F (ITU-T G.7041/Y.1303) */

+

+/*

+ * Requested by Oolan Zimmer <oz@gcom.com> for use in Gcom's T1/E1 line

+ * monitoring equipment.

+ */

+#define DLT_GCOM_T1E1		172

+#define DLT_GCOM_SERIAL		173

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>.  The DLT_ is used

+ * for internal communication to Physical Interface Cards (PIC)

+ */

+#define DLT_JUNIPER_PIC_PEER    174

+

+/*

+ * Link types requested by Gregor Maier <gregor@endace.com> of Endace

+ * Measurement Systems.  They add an ERF header (see

+ * http://www.endace.com/support/EndaceRecordFormat.pdf) in front of

+ * the link-layer header.

+ */

+#define DLT_ERF_ETH		175	/* Ethernet */

+#define DLT_ERF_POS		176	/* Packet-over-SONET */

+

+/*

+ * Requested by Daniele Orlandi <daniele@orlandi.com> for raw LAPD

+ * for vISDN (http://www.orlandi.com/visdn/).  Its link-layer header

+ * includes additional information before the LAPD header, so it's

+ * not necessarily a generic LAPD header.

+ */

+#define DLT_LINUX_LAPD		177

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>. 

+ * The DLT_ are used for prepending meta-information

+ * like interface index, interface name

+ * before standard Ethernet, PPP, Frelay & C-HDLC Frames

+ */

+#define DLT_JUNIPER_ETHER       178

+#define DLT_JUNIPER_PPP         179

+#define DLT_JUNIPER_FRELAY      180

+#define DLT_JUNIPER_CHDLC       181

+

+/*

+ * Multi Link Frame Relay (FRF.16)

+ */

+#define DLT_MFR                 182

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>. 

+ * The DLT_ is used for internal communication with a

+ * voice Adapter Card (PIC)

+ */

+#define DLT_JUNIPER_VP          183

+

+/*

+ * Arinc 429 frames.

+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.

+ * Every frame contains a 32bit A429 label.

+ * More documentation on Arinc 429 can be found at

+ * http://www.condoreng.com/support/downloads/tutorials/ARINCTutorial.pdf

+ */

+#define DLT_A429                184

+

+/*

+ * Arinc 653 Interpartition Communication messages.

+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.

+ * Please refer to the A653-1 standard for more information.

+ */

+#define DLT_A653_ICM            185

+

+/*

+ * USB packets, beginning with a USB setup header; requested by

+ * Paolo Abeni <paolo.abeni@email.it>.

+ */

+#define DLT_USB			186

+

+/*

+ * Bluetooth HCI UART transport layer (part H:4); requested by

+ * Paolo Abeni.

+ */

+#define DLT_BLUETOOTH_HCI_H4	187

+

+/*

+ * IEEE 802.16 MAC Common Part Sublayer; requested by Maria Cruz

+ * <cruz_petagay@bah.com>.

+ */

+#define DLT_IEEE802_16_MAC_CPS	188

+

+/*

+ * USB packets, beginning with a Linux USB header; requested by

+ * Paolo Abeni <paolo.abeni@email.it>.

+ */

+#define DLT_USB_LINUX		189

+

+/*

+ * Controller Area Network (CAN) v. 2.0B packets.

+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.

+ * Used to dump CAN packets coming from a CAN Vector board.

+ * More documentation on the CAN v2.0B frames can be found at

+ * http://www.can-cia.org/downloads/?269

+ */

+#define DLT_CAN20B              190

+

+/*

+ * IEEE 802.15.4, with address fields padded, as is done by Linux

+ * drivers; requested by Juergen Schimmer.

+ */

+#define DLT_IEEE802_15_4_LINUX	191

+

+/*

+ * Per Packet Information encapsulated packets.

+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.

+ */

+#define DLT_PPI			192

+

+/*

+ * Header for 802.16 MAC Common Part Sublayer plus a radiotap radio header;

+ * requested by Charles Clancy.

+ */

+#define DLT_IEEE802_16_MAC_CPS_RADIO	193

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>. 

+ * The DLT_ is used for internal communication with a

+ * integrated service module (ISM).

+ */

+#define DLT_JUNIPER_ISM         194

+

+/*

+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no

+ * nothing); requested by Mikko Saarnivala <mikko.saarnivala@sensinode.com>.

+ */

+#define DLT_IEEE802_15_4	195

+

+/*

+ * Various link-layer types, with a pseudo-header, for SITA

+ * (http://www.sita.aero/); requested by Fulko Hew (fulko.hew@gmail.com).

+ */

+#define DLT_SITA		196

+

+/*

+ * Various link-layer types, with a pseudo-header, for Endace DAG cards;

+ * encapsulates Endace ERF records.  Requested by Stephen Donnelly

+ * <stephen@endace.com>.

+ */

+#define DLT_ERF			197

+

+/*

+ * Special header prepended to Ethernet packets when capturing from a

+ * u10 Networks board.  Requested by Phil Mulholland

+ * <phil@u10networks.com>.

+ */

+#define DLT_RAIF1		198

+

+/*

+ * IPMB packet for IPMI, beginning with the I2C slave address, followed

+ * by the netFn and LUN, etc..  Requested by Chanthy Toeung

+ * <chanthy.toeung@ca.kontron.com>.

+ */

+#define DLT_IPMB		199

+

+/*

+ * Juniper-private data link type, as per request from

+ * Hannes Gredler <hannes@juniper.net>. 

+ * The DLT_ is used for capturing data on a secure tunnel interface.

+ */

+#define DLT_JUNIPER_ST          200

+

+/*

+ * Bluetooth HCI UART transport layer (part H:4), with pseudo-header

+ * that includes direction information; requested by Paolo Abeni.

+ */

+#define DLT_BLUETOOTH_HCI_H4_WITH_PHDR	201

+

+/*

+ * AX.25 packet with a 1-byte KISS header; see

+ *

+ *	http://www.ax25.net/kiss.htm

+ *

+ * as per Richard Stearn <richard@rns-stearn.demon.co.uk>.

+ */

+#define DLT_AX25_KISS		202

+

+/*

+ * LAPD packets from an ISDN channel, starting with the address field,

+ * with no pseudo-header.

+ * Requested by Varuna De Silva <varunax@gmail.com>.

+ */

+#define DLT_LAPD		203

+

+/*

+ * Variants of various link-layer headers, with a one-byte direction

+ * pseudo-header prepended - zero means "received by this host",

+ * non-zero (any non-zero value) means "sent by this host" - as per

+ * Will Barker <w.barker@zen.co.uk>.

+ */

+#define DLT_PPP_WITH_DIR	204	/* PPP - don't confuse with DLT_PPP_WITH_DIRECTION */

+#define DLT_C_HDLC_WITH_DIR	205	/* Cisco HDLC */

+#define DLT_FRELAY_WITH_DIR	206	/* Frame Relay */

+#define DLT_LAPB_WITH_DIR	207	/* LAPB */

+

+/*

+ * 208 is reserved for an as-yet-unspecified proprietary link-layer

+ * type, as requested by Will Barker.

+ */

+

+/*

+ * IPMB with a Linux-specific pseudo-header; as requested by Alexey Neyman

+ * <avn@pigeonpoint.com>.

+ */

+#define DLT_IPMB_LINUX		209

+

+/*

+ * FlexRay automotive bus - http://www.flexray.com/ - as requested

+ * by Hannes Kaelber <hannes.kaelber@x2e.de>.

+ */

+#define DLT_FLEXRAY		210

+

+/*

+ * Media Oriented Systems Transport (MOST) bus for multimedia

+ * transport - http://www.mostcooperation.com/ - as requested

+ * by Hannes Kaelber <hannes.kaelber@x2e.de>.

+ */

+#define DLT_MOST		211

+

+/*

+ * Local Interconnect Network (LIN) bus for vehicle networks -

+ * http://www.lin-subbus.org/ - as requested by Hannes Kaelber

+ * <hannes.kaelber@x2e.de>.

+ */

+#define DLT_LIN			212

+

+/*

+ * X2E-private data link type used for serial line capture,

+ * as requested by Hannes Kaelber <hannes.kaelber@x2e.de>.

+ */

+#define DLT_X2E_SERIAL		213

+

+/*

+ * X2E-private data link type used for the Xoraya data logger

+ * family, as requested by Hannes Kaelber <hannes.kaelber@x2e.de>.

+ */

+#define DLT_X2E_XORAYA		214

+

+/*

+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no

+ * nothing), but with the PHY-level data for non-ASK PHYs (4 octets

+ * of 0 as preamble, one octet of SFD, one octet of frame length+

+ * reserved bit, and then the MAC-layer data, starting with the

+ * frame control field).

+ *

+ * Requested by Max Filippov <jcmvbkbc@gmail.com>.

+ */

+#define DLT_IEEE802_15_4_NONASK_PHY	215

+

+

+/*

+ * DLT and savefile link type values are split into a class and

+ * a member of that class.  A class value of 0 indicates a regular

+ * DLT_/LINKTYPE_ value.

+ */

+#define DLT_CLASS(x)		((x) & 0x03ff0000)

+

+/*

+ * NetBSD-specific generic "raw" link type.  The class value indicates

+ * that this is the generic raw type, and the lower 16 bits are the

+ * address family we're dealing with.  Those values are NetBSD-specific;

+ * do not assume that they correspond to AF_ values for your operating

+ * system.

+ */

+#define	DLT_CLASS_NETBSD_RAWAF	0x02240000

+#define	DLT_NETBSD_RAWAF(af)	(DLT_CLASS_NETBSD_RAWAF | (af))

+#define	DLT_NETBSD_RAWAF_AF(x)	((x) & 0x0000ffff)

+#define	DLT_IS_NETBSD_RAWAF(x)	(DLT_CLASS(x) == DLT_CLASS_NETBSD_RAWAF)

+

+

+/*

+ * The instruction encodings.

+ */

+/* instruction classes */

+#define BPF_CLASS(code) ((code) & 0x07)

+#define		BPF_LD		0x00

+#define		BPF_LDX		0x01

+#define		BPF_ST		0x02

+#define		BPF_STX		0x03

+#define		BPF_ALU		0x04

+#define		BPF_JMP		0x05

+#define		BPF_RET		0x06

+#define		BPF_MISC	0x07

+

+/* ld/ldx fields */

+#define BPF_SIZE(code)	((code) & 0x18)

+#define		BPF_W		0x00

+#define		BPF_H		0x08

+#define		BPF_B		0x10

+#define BPF_MODE(code)	((code) & 0xe0)

+#define		BPF_IMM 	0x00

+#define		BPF_ABS		0x20

+#define		BPF_IND		0x40

+#define		BPF_MEM		0x60

+#define		BPF_LEN		0x80

+#define		BPF_MSH		0xa0

+

+/* alu/jmp fields */

+#define BPF_OP(code)	((code) & 0xf0)

+#define		BPF_ADD		0x00

+#define		BPF_SUB		0x10

+#define		BPF_MUL		0x20

+#define		BPF_DIV		0x30

+#define		BPF_OR		0x40

+#define		BPF_AND		0x50

+#define		BPF_LSH		0x60

+#define		BPF_RSH		0x70

+#define		BPF_NEG		0x80

+#define		BPF_JA		0x00

+#define		BPF_JEQ		0x10

+#define		BPF_JGT		0x20

+#define		BPF_JGE		0x30

+#define		BPF_JSET	0x40

+#define BPF_SRC(code)	((code) & 0x08)

+#define		BPF_K		0x00

+#define		BPF_X		0x08

+

+/* ret - BPF_K and BPF_X also apply */

+#define BPF_RVAL(code)	((code) & 0x18)

+#define		BPF_A		0x10

+

+/* misc */

+#define BPF_MISCOP(code) ((code) & 0xf8)

+#define		BPF_TAX		0x00

+#define		BPF_TXA		0x80

+

+/*

+ * The instruction data structure.

+ */

+struct bpf_insn {

+	u_short	code;

+	u_char 	jt;

+	u_char 	jf;

+	bpf_u_int32 k;

+};

+

+/*

+ * Macros for insn array initializers.

+ */

+#define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }

+#define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }

+

+#if __STDC__ || defined(__cplusplus)

+extern int bpf_validate(const struct bpf_insn *, int);

+extern u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);

+#else

+extern int bpf_validate();

+extern u_int bpf_filter();

+#endif

+

+/*

+ * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).

+ */

+#define BPF_MEMWORDS 16

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/namedb.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/namedb.h
new file mode 100644
index 0000000..8298e35
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/namedb.h
@@ -0,0 +1,89 @@
+/*

+ * Copyright (c) 1994, 1996

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *	This product includes software developed by the Computer Systems

+ *	Engineering Group at Lawrence Berkeley Laboratory.

+ * 4. Neither the name of the University nor of the Laboratory may be used

+ *    to endorse or promote products derived from this software without

+ *    specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/namedb.h,v 1.1 2006/10/04 18:09:22 guy Exp $ (LBL)

+ */

+

+#ifndef lib_pcap_namedb_h

+#define lib_pcap_namedb_h

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*

+ * As returned by the pcap_next_etherent()

+ * XXX this stuff doesn't belong in this interface, but this

+ * library already must do name to address translation, so

+ * on systems that don't have support for /etc/ethers, we

+ * export these hooks since they'll

+ */

+struct pcap_etherent {

+	u_char addr[6];

+	char name[122];

+};

+#ifndef PCAP_ETHERS_FILE

+#define PCAP_ETHERS_FILE "/etc/ethers"

+#endif

+struct	pcap_etherent *pcap_next_etherent(FILE *);

+u_char *pcap_ether_hostton(const char*);

+u_char *pcap_ether_aton(const char *);

+

+bpf_u_int32 **pcap_nametoaddr(const char *);

+#ifdef INET6

+struct addrinfo *pcap_nametoaddrinfo(const char *);

+#endif

+bpf_u_int32 pcap_nametonetaddr(const char *);

+

+int	pcap_nametoport(const char *, int *, int *);

+int	pcap_nametoportrange(const char *, int *, int *, int *);

+int	pcap_nametoproto(const char *);

+int	pcap_nametoeproto(const char *);

+int	pcap_nametollc(const char *);

+/*

+ * If a protocol is unknown, PROTO_UNDEF is returned.

+ * Also, pcap_nametoport() returns the protocol along with the port number.

+ * If there are ambiguous entried in /etc/services (i.e. domain

+ * can be either tcp or udp) PROTO_UNDEF is returned.

+ */

+#define PROTO_UNDEF		-1

+

+/* XXX move these to pcap-int.h? */

+int __pcap_atodn(const char *, bpf_u_int32 *);

+int __pcap_atoin(const char *, bpf_u_int32 *);

+u_short	__pcap_nametodnaddr(const char *);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/pcap.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/pcap.h
new file mode 100644
index 0000000..fbf8341
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/pcap.h
@@ -0,0 +1,407 @@
+/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */

+/*

+ * Copyright (c) 1993, 1994, 1995, 1996, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *	This product includes software developed by the Computer Systems

+ *	Engineering Group at Lawrence Berkeley Laboratory.

+ * 4. Neither the name of the University nor of the Laboratory may be used

+ *    to endorse or promote products derived from this software without

+ *    specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/pcap.h,v 1.4.2.11 2008-10-06 15:38:39 gianluca Exp $ (LBL)

+ */

+

+#ifndef lib_pcap_pcap_h

+#define lib_pcap_pcap_h

+

+#if defined(WIN32)

+  #include <pcap-stdinc.h>

+#elif defined(MSDOS)

+  #include <sys/types.h>

+  #include <sys/socket.h>  /* u_int, u_char etc. */

+#else /* UN*X */

+  #include <sys/types.h>

+  #include <sys/time.h>

+#endif /* WIN32/MSDOS/UN*X */

+

+#ifndef PCAP_DONT_INCLUDE_PCAP_BPF_H

+#include <pcap/bpf.h>

+#endif

+

+#include <stdio.h>

+

+#ifdef HAVE_REMOTE

+	// We have to define the SOCKET here, although it has been defined in sockutils.h

+	// This is to avoid the distribution of the 'sockutils.h' file around

+	// (for example in the WinPcap developer's pack)

+	#ifndef SOCKET

+		#ifdef WIN32

+			#define SOCKET unsigned int

+		#else

+			#define SOCKET int

+		#endif

+	#endif

+#endif

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#define PCAP_VERSION_MAJOR 2

+#define PCAP_VERSION_MINOR 4

+

+#define PCAP_ERRBUF_SIZE 256

+

+/*

+ * Compatibility for systems that have a bpf.h that

+ * predates the bpf typedefs for 64-bit support.

+ */

+#if BPF_RELEASE - 0 < 199406

+typedef	int bpf_int32;

+typedef	u_int bpf_u_int32;

+#endif

+

+typedef struct pcap pcap_t;

+typedef struct pcap_dumper pcap_dumper_t;

+typedef struct pcap_if pcap_if_t;

+typedef struct pcap_addr pcap_addr_t;

+

+/*

+ * The first record in the file contains saved values for some

+ * of the flags used in the printout phases of tcpdump.

+ * Many fields here are 32 bit ints so compilers won't insert unwanted

+ * padding; these files need to be interchangeable across architectures.

+ *

+ * Do not change the layout of this structure, in any way (this includes

+ * changes that only affect the length of fields in this structure).

+ *

+ * Also, do not change the interpretation of any of the members of this

+ * structure, in any way (this includes using values other than

+ * LINKTYPE_ values, as defined in "savefile.c", in the "linktype"

+ * field).

+ *

+ * Instead:

+ *

+ *	introduce a new structure for the new format, if the layout

+ *	of the structure changed;

+ *

+ *	send mail to "tcpdump-workers@lists.tcpdump.org", requesting

+ *	a new magic number for your new capture file format, and, when

+ *	you get the new magic number, put it in "savefile.c";

+ *

+ *	use that magic number for save files with the changed file

+ *	header;

+ *

+ *	make the code in "savefile.c" capable of reading files with

+ *	the old file header as well as files with the new file header

+ *	(using the magic number to determine the header format).

+ *

+ * Then supply the changes as a patch at

+ *

+ *	http://sourceforge.net/projects/libpcap/

+ *

+ * so that future versions of libpcap and programs that use it (such as

+ * tcpdump) will be able to read your new capture file format.

+ */

+struct pcap_file_header {

+	bpf_u_int32 magic;

+	u_short version_major;

+	u_short version_minor;

+	bpf_int32 thiszone;	/* gmt to local correction */

+	bpf_u_int32 sigfigs;	/* accuracy of timestamps */

+	bpf_u_int32 snaplen;	/* max length saved portion of each pkt */

+	bpf_u_int32 linktype;	/* data link type (LINKTYPE_*) */

+};

+

+/*

+ * Macros for the value returned by pcap_datalink_ext().

+ * 

+ * If LT_FCS_LENGTH_PRESENT(x) is true, the LT_FCS_LENGTH(x) macro

+ * gives the FCS length of packets in the capture.

+ */

+#define LT_FCS_LENGTH_PRESENT(x)	((x) & 0x04000000)

+#define LT_FCS_LENGTH(x)		(((x) & 0xF0000000) >> 28)

+#define LT_FCS_DATALINK_EXT(x)		((((x) & 0xF) << 28) | 0x04000000)

+

+typedef enum {

+       PCAP_D_INOUT = 0,

+       PCAP_D_IN,

+       PCAP_D_OUT

+} pcap_direction_t;

+

+/*

+ * Generic per-packet information, as supplied by libpcap.

+ *

+ * The time stamp can and should be a "struct timeval", regardless of

+ * whether your system supports 32-bit tv_sec in "struct timeval",

+ * 64-bit tv_sec in "struct timeval", or both if it supports both 32-bit

+ * and 64-bit applications.  The on-disk format of savefiles uses 32-bit

+ * tv_sec (and tv_usec); this structure is irrelevant to that.  32-bit

+ * and 64-bit versions of libpcap, even if they're on the same platform,

+ * should supply the appropriate version of "struct timeval", even if

+ * that's not what the underlying packet capture mechanism supplies.

+ */

+struct pcap_pkthdr {

+	struct timeval ts;	/* time stamp */

+	bpf_u_int32 caplen;	/* length of portion present */

+	bpf_u_int32 len;	/* length this packet (off wire) */

+};

+

+/*

+ * As returned by the pcap_stats()

+ */

+struct pcap_stat {

+	u_int ps_recv;		/* number of packets received */

+	u_int ps_drop;		/* number of packets dropped */

+	u_int ps_ifdrop;	/* drops by interface XXX not yet supported */

+#ifdef HAVE_REMOTE

+	u_int ps_capt;		/* number of packets that are received by the application; please get rid off the Win32 ifdef */

+	u_int ps_sent;		/* number of packets sent by the server on the network */

+	u_int ps_netdrop;	/* number of packets lost on the network */

+#endif /* HAVE_REMOTE */

+};

+

+#ifdef MSDOS

+/*

+ * As returned by the pcap_stats_ex()

+ */

+struct pcap_stat_ex {

+       u_long  rx_packets;        /* total packets received       */

+       u_long  tx_packets;        /* total packets transmitted    */

+       u_long  rx_bytes;          /* total bytes received         */

+       u_long  tx_bytes;          /* total bytes transmitted      */

+       u_long  rx_errors;         /* bad packets received         */

+       u_long  tx_errors;         /* packet transmit problems     */

+       u_long  rx_dropped;        /* no space in Rx buffers       */

+       u_long  tx_dropped;        /* no space available for Tx    */

+       u_long  multicast;         /* multicast packets received   */

+       u_long  collisions;

+

+       /* detailed rx_errors: */

+       u_long  rx_length_errors;

+       u_long  rx_over_errors;    /* receiver ring buff overflow  */

+       u_long  rx_crc_errors;     /* recv'd pkt with crc error    */

+       u_long  rx_frame_errors;   /* recv'd frame alignment error */

+       u_long  rx_fifo_errors;    /* recv'r fifo overrun          */

+       u_long  rx_missed_errors;  /* recv'r missed packet         */

+

+       /* detailed tx_errors */

+       u_long  tx_aborted_errors;

+       u_long  tx_carrier_errors;

+       u_long  tx_fifo_errors;

+       u_long  tx_heartbeat_errors;

+       u_long  tx_window_errors;

+     };

+#endif

+

+/*

+ * Item in a list of interfaces.

+ */

+struct pcap_if {

+	struct pcap_if *next;

+	char *name;		/* name to hand to "pcap_open_live()" */

+	char *description;	/* textual description of interface, or NULL */

+	struct pcap_addr *addresses;

+	bpf_u_int32 flags;	/* PCAP_IF_ interface flags */

+};

+

+#define PCAP_IF_LOOPBACK	0x00000001	/* interface is loopback */

+

+/*

+ * Representation of an interface address.

+ */

+struct pcap_addr {

+	struct pcap_addr *next;

+	struct sockaddr *addr;		/* address */

+	struct sockaddr *netmask;	/* netmask for that address */

+	struct sockaddr *broadaddr;	/* broadcast address for that address */

+	struct sockaddr *dstaddr;	/* P2P destination address for that address */

+};

+

+typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,

+			     const u_char *);

+

+/*

+ * Error codes for the pcap API.

+ * These will all be negative, so you can check for the success or

+ * failure of a call that returns these codes by checking for a

+ * negative value.

+ */

+#define PCAP_ERROR			-1	/* generic error code */

+#define PCAP_ERROR_BREAK		-2	/* loop terminated by pcap_breakloop */

+#define PCAP_ERROR_NOT_ACTIVATED	-3	/* the capture needs to be activated */

+#define PCAP_ERROR_ACTIVATED		-4	/* the operation can't be performed on already activated captures */

+#define PCAP_ERROR_NO_SUCH_DEVICE	-5	/* no such device exists */

+#define PCAP_ERROR_RFMON_NOTSUP		-6	/* this device doesn't support rfmon (monitor) mode */

+#define PCAP_ERROR_NOT_RFMON		-7	/* operation supported only in monitor mode */

+#define PCAP_ERROR_PERM_DENIED		-8	/* no permission to open the device */

+#define PCAP_ERROR_IFACE_NOT_UP		-9	/* interface isn't up */

+

+/*

+ * Warning codes for the pcap API.

+ * These will all be positive and non-zero, so they won't look like

+ * errors.

+ */

+#define PCAP_WARNING			1	/* generic warning code */

+#define PCAP_WARNING_PROMISC_NOTSUP	2	/* this device doesn't support promiscuous mode */

+

+char	*pcap_lookupdev(char *);

+int	pcap_lookupnet(const char *, bpf_u_int32 *, bpf_u_int32 *, char *);

+

+pcap_t	*pcap_create(const char *, char *);

+int	pcap_set_snaplen(pcap_t *, int);

+int	pcap_set_promisc(pcap_t *, int);

+int	pcap_can_set_rfmon(pcap_t *);

+int	pcap_set_rfmon(pcap_t *, int);

+int	pcap_set_timeout(pcap_t *, int);

+int	pcap_set_buffer_size(pcap_t *, int);

+int	pcap_activate(pcap_t *);

+

+pcap_t	*pcap_open_live(const char *, int, int, int, char *);

+pcap_t	*pcap_open_dead(int, int);

+pcap_t	*pcap_open_offline(const char *, char *);

+#if defined(WIN32)

+pcap_t  *pcap_hopen_offline(intptr_t, char *);

+#if !defined(LIBPCAP_EXPORTS)

+#define pcap_fopen_offline(f,b) \

+	pcap_hopen_offline(_get_osfhandle(_fileno(f)), b)

+#else /*LIBPCAP_EXPORTS*/

+static pcap_t *pcap_fopen_offline(FILE *, char *);

+#endif

+#else /*WIN32*/

+pcap_t	*pcap_fopen_offline(FILE *, char *);

+#endif /*WIN32*/

+

+void	pcap_close(pcap_t *);

+int	pcap_loop(pcap_t *, int, pcap_handler, u_char *);

+int	pcap_dispatch(pcap_t *, int, pcap_handler, u_char *);

+const u_char*

+	pcap_next(pcap_t *, struct pcap_pkthdr *);

+int 	pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **);

+void	pcap_breakloop(pcap_t *);

+int	pcap_stats(pcap_t *, struct pcap_stat *);

+int	pcap_setfilter(pcap_t *, struct bpf_program *);

+int 	pcap_setdirection(pcap_t *, pcap_direction_t);

+int	pcap_getnonblock(pcap_t *, char *);

+int	pcap_setnonblock(pcap_t *, int, char *);

+int	pcap_inject(pcap_t *, const void *, size_t);

+int	pcap_sendpacket(pcap_t *, const u_char *, int);

+const char *pcap_statustostr(int);

+const char *pcap_strerror(int);

+char	*pcap_geterr(pcap_t *);

+void	pcap_perror(pcap_t *, char *);

+int	pcap_compile(pcap_t *, struct bpf_program *, const char *, int,

+	    bpf_u_int32);

+int	pcap_compile_nopcap(int, int, struct bpf_program *,

+	    const char *, int, bpf_u_int32);

+void	pcap_freecode(struct bpf_program *);

+int	pcap_offline_filter(struct bpf_program *, const struct pcap_pkthdr *,

+	    const u_char *);

+int	pcap_datalink(pcap_t *);

+int	pcap_datalink_ext(pcap_t *);

+int	pcap_list_datalinks(pcap_t *, int **);

+int	pcap_set_datalink(pcap_t *, int);

+void	pcap_free_datalinks(int *);

+int	pcap_datalink_name_to_val(const char *);

+const char *pcap_datalink_val_to_name(int);

+const char *pcap_datalink_val_to_description(int);

+int	pcap_snapshot(pcap_t *);

+int	pcap_is_swapped(pcap_t *);

+int	pcap_major_version(pcap_t *);

+int	pcap_minor_version(pcap_t *);

+

+/* XXX */

+FILE	*pcap_file(pcap_t *);

+int	pcap_fileno(pcap_t *);

+

+pcap_dumper_t *pcap_dump_open(pcap_t *, const char *);

+pcap_dumper_t *pcap_dump_fopen(pcap_t *, FILE *fp);

+FILE	*pcap_dump_file(pcap_dumper_t *);

+long	pcap_dump_ftell(pcap_dumper_t *);

+int	pcap_dump_flush(pcap_dumper_t *);

+void	pcap_dump_close(pcap_dumper_t *);

+void	pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *);

+

+int	pcap_findalldevs(pcap_if_t **, char *);

+void	pcap_freealldevs(pcap_if_t *);

+

+const char *pcap_lib_version(void);

+

+/* XXX this guy lives in the bpf tree */

+u_int	bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);

+int	bpf_validate(const struct bpf_insn *f, int len);

+char	*bpf_image(const struct bpf_insn *, int);

+void	bpf_dump(const struct bpf_program *, int);

+

+#if defined(WIN32)

+

+/*

+ * Win32 definitions

+ */

+

+int pcap_setbuff(pcap_t *p, int dim);

+int pcap_setmode(pcap_t *p, int mode);

+int pcap_setmintocopy(pcap_t *p, int size);

+

+#ifdef WPCAP

+/* Include file with the wpcap-specific extensions */

+#include <Win32-Extensions.h>

+#endif /* WPCAP */

+

+#define MODE_CAPT 0

+#define MODE_STAT 1

+#define MODE_MON 2

+

+#elif defined(MSDOS)

+

+/*

+ * MS-DOS definitions

+ */

+

+int  pcap_stats_ex (pcap_t *, struct pcap_stat_ex *);

+void pcap_set_wait (pcap_t *p, void (*yield)(void), int wait);

+u_long pcap_mac_packets (void);

+

+#else /* UN*X */

+

+/*

+ * UN*X definitions

+ */

+

+int	pcap_get_selectable_fd(pcap_t *);

+

+#endif /* WIN32/MSDOS/UN*X */

+

+#ifdef HAVE_REMOTE

+/* Includes most of the public stuff that is needed for the remote capture */

+#include <remote-ext.h>

+#endif	 /* HAVE_REMOTE */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/sll.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/sll.h
new file mode 100644
index 0000000..5907bed
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/sll.h
@@ -0,0 +1,129 @@
+/*-

+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * This code is derived from the Stanford/CMU enet packet filter,

+ * (net/enet.c) distributed as part of 4.3BSD, and code contributed

+ * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence

+ * Berkeley Laboratory.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *      This product includes software developed by the University of

+ *      California, Berkeley and its contributors.

+ * 4. Neither the name of the University nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/sll.h,v 1.2.2.1 2008-05-30 01:36:06 guy Exp $ (LBL)

+ */

+

+/*

+ * For captures on Linux cooked sockets, we construct a fake header

+ * that includes:

+ *

+ *	a 2-byte "packet type" which is one of:

+ *

+ *		LINUX_SLL_HOST		packet was sent to us

+ *		LINUX_SLL_BROADCAST	packet was broadcast

+ *		LINUX_SLL_MULTICAST	packet was multicast

+ *		LINUX_SLL_OTHERHOST	packet was sent to somebody else

+ *		LINUX_SLL_OUTGOING	packet was sent *by* us;

+ *

+ *	a 2-byte Ethernet protocol field;

+ *

+ *	a 2-byte link-layer type;

+ *

+ *	a 2-byte link-layer address length;

+ *

+ *	an 8-byte source link-layer address, whose actual length is

+ *	specified by the previous value.

+ *

+ * All fields except for the link-layer address are in network byte order.

+ *

+ * DO NOT change the layout of this structure, or change any of the

+ * LINUX_SLL_ values below.  If you must change the link-layer header

+ * for a "cooked" Linux capture, introduce a new DLT_ type (ask

+ * "tcpdump-workers@lists.tcpdump.org" for one, so that you don't give it

+ * a value that collides with a value already being used), and use the

+ * new header in captures of that type, so that programs that can

+ * handle DLT_LINUX_SLL captures will continue to handle them correctly

+ * without any change, and so that capture files with different headers

+ * can be told apart and programs that read them can dissect the

+ * packets in them.

+ */

+

+#ifndef lib_pcap_sll_h

+#define lib_pcap_sll_h

+

+/*

+ * A DLT_LINUX_SLL fake link-layer header.

+ */

+#define SLL_HDR_LEN	16		/* total header length */

+#define SLL_ADDRLEN	8		/* length of address field */

+

+struct sll_header {

+	u_int16_t sll_pkttype;		/* packet type */

+	u_int16_t sll_hatype;		/* link-layer address type */

+	u_int16_t sll_halen;		/* link-layer address length */

+	u_int8_t sll_addr[SLL_ADDRLEN];	/* link-layer address */

+	u_int16_t sll_protocol;		/* protocol */

+};

+

+/*

+ * The LINUX_SLL_ values for "sll_pkttype"; these correspond to the

+ * PACKET_ values on Linux, but are defined here so that they're

+ * available even on systems other than Linux, and so that they

+ * don't change even if the PACKET_ values change.

+ */

+#define LINUX_SLL_HOST		0

+#define LINUX_SLL_BROADCAST	1

+#define LINUX_SLL_MULTICAST	2

+#define LINUX_SLL_OTHERHOST	3

+#define LINUX_SLL_OUTGOING	4

+

+/*

+ * The LINUX_SLL_ values for "sll_protocol"; these correspond to the

+ * ETH_P_ values on Linux, but are defined here so that they're

+ * available even on systems other than Linux.  We assume, for now,

+ * that the ETH_P_ values won't change in Linux; if they do, then:

+ *

+ *	if we don't translate them in "pcap-linux.c", capture files

+ *	won't necessarily be readable if captured on a system that

+ *	defines ETH_P_ values that don't match these values;

+ *

+ *	if we do translate them in "pcap-linux.c", that makes life

+ *	unpleasant for the BPF code generator, as the values you test

+ *	for in the kernel aren't the values that you test for when

+ *	reading a capture file, so the fixup code run on BPF programs

+ *	handed to the kernel ends up having to do more work.

+ *

+ * Add other values here as necessary, for handling packet types that

+ * might show up on non-Ethernet, non-802.x networks.  (Not all the ones

+ * in the Linux "if_ether.h" will, I suspect, actually show up in

+ * captures.)

+ */

+#define LINUX_SLL_P_802_3	0x0001	/* Novell 802.3 frames without 802.2 LLC header */

+#define LINUX_SLL_P_802_2	0x0004	/* 802.2 frames (not D/I/X Ethernet) */

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/usb.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/usb.h
new file mode 100644
index 0000000..f150d3b
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/usb.h
@@ -0,0 +1,90 @@
+/*

+ * Copyright (c) 2006 Paolo Abeni (Italy)

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ *

+ * 1. Redistributions of source code must retain the above copyright

+ * notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ * notice, this list of conditions and the following disclaimer in the

+ * documentation and/or other materials provided with the distribution.

+ * 3. The name of the author may not be used to endorse or promote 

+ * products derived from this software without specific prior written 

+ * permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ *

+ * Basic USB data struct

+ * By Paolo Abeni <paolo.abeni@email.it>

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/usb.h,v 1.6 2007/09/22 02:06:08 guy Exp $

+ */

+ 

+#ifndef _PCAP_USB_STRUCTS_H__

+#define _PCAP_USB_STRUCTS_H__

+

+/* 

+ * possible transfer mode

+ */

+#define URB_TRANSFER_IN   0x80

+#define URB_ISOCHRONOUS   0x0

+#define URB_INTERRUPT     0x1

+#define URB_CONTROL       0x2

+#define URB_BULK          0x3

+

+/*

+ * possible event type

+ */

+#define URB_SUBMIT        'S'

+#define URB_COMPLETE      'C'

+#define URB_ERROR         'E'

+

+/*

+ * USB setup header as defined in USB specification.

+ * Appears at the front of each packet in DLT_USB captures.

+ */

+typedef struct _usb_setup {

+	u_int8_t bmRequestType;

+	u_int8_t bRequest;

+	u_int16_t wValue;

+	u_int16_t wIndex;

+	u_int16_t wLength;

+} pcap_usb_setup;

+

+

+/*

+ * Header prepended by linux kernel to each event.

+ * Appears at the front of each packet in DLT_USB_LINUX captures.

+ */

+typedef struct _usb_header {

+	u_int64_t id;

+	u_int8_t event_type;

+	u_int8_t transfer_type;

+	u_int8_t endpoint_number;

+	u_int8_t device_address;

+	u_int16_t bus_id;

+	char setup_flag;/*if !=0 the urb setup header is not present*/

+	char data_flag; /*if !=0 no urb data is present*/

+	int64_t ts_sec;

+	int32_t ts_usec;

+	int32_t status;

+	u_int32_t urb_len;

+	u_int32_t data_len; /* amount of urb data really present in this event*/

+	pcap_usb_setup setup;

+} pcap_usb_header;

+

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/vlan.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/vlan.h
new file mode 100644
index 0000000..00ed9b6
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/pcap/vlan.h
@@ -0,0 +1,46 @@
+/*-

+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997

+ *	The Regents of the University of California.  All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ * 3. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *      This product includes software developed by the University of

+ *      California, Berkeley and its contributors.

+ * 4. Neither the name of the University nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * @(#) $Header: /tcpdump/master/libpcap/pcap/vlan.h,v 1.1.2.2 2008-08-06 07:45:59 guy Exp $

+ */

+

+#ifndef lib_pcap_vlan_h

+#define lib_pcap_vlan_h

+

+struct vlan_tag {

+	u_int16_t	vlan_tpid;		/* ETH_P_8021Q */

+	u_int16_t	vlan_tci;		/* VLAN TCI */

+};

+

+#define VLAN_TAG_LEN	4

+

+#endif

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/remote-ext.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/remote-ext.h
new file mode 100644
index 0000000..9f54d69
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/remote-ext.h
@@ -0,0 +1,444 @@
+/*

+ * Copyright (c) 2002 - 2003

+ * NetGroup, Politecnico di Torino (Italy)

+ * All rights reserved.

+ * 

+ * Redistribution and use in source and binary forms, with or without 

+ * modification, are permitted provided that the following conditions 

+ * are met:

+ * 

+ * 1. Redistributions of source code must retain the above copyright 

+ * notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright 

+ * notice, this list of conditions and the following disclaimer in the 

+ * documentation and/or other materials provided with the distribution. 

+ * 3. Neither the name of the Politecnico di Torino nor the names of its 

+ * contributors may be used to endorse or promote products derived from 

+ * this software without specific prior written permission. 

+ * 

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 

+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 

+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 

+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 

+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 

+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 

+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 

+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 

+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 

+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 

+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ * 

+ */

+

+

+#ifndef __REMOTE_EXT_H__

+#define __REMOTE_EXT_H__

+

+

+#ifndef HAVE_REMOTE

+#error Please do not include this file directly. Just define HAVE_REMOTE and then include pcap.h

+#endif

+

+// Definition for Microsoft Visual Studio

+#if _MSC_VER > 1000

+#pragma once

+#endif

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*!

+	\file remote-ext.h

+

+	The goal of this file it to include most of the new definitions that should be

+	placed into the pcap.h file.

+

+	It includes all new definitions (structures and functions like pcap_open().

+    Some of the functions are not really a remote feature, but, right now, 

+	they are placed here.

+*/

+

+

+

+// All this stuff is public

+/*! \addtogroup remote_struct

+	\{

+*/

+

+

+

+

+/*!

+	\brief Defines the maximum buffer size in which address, port, interface names are kept.

+

+	In case the adapter name or such is larger than this value, it is truncated.

+	This is not used by the user; however it must be aware that an hostname / interface

+	name longer than this value will be truncated.

+*/

+#define PCAP_BUF_SIZE 1024

+

+

+/*! \addtogroup remote_source_ID

+	\{

+*/

+

+

+/*!

+	\brief Internal representation of the type of source in use (file, 

+	remote/local interface).

+

+	This indicates a file, i.e. the user want to open a capture from a local file.

+*/

+#define PCAP_SRC_FILE 2

+/*!

+	\brief Internal representation of the type of source in use (file, 

+	remote/local interface).

+

+	This indicates a local interface, i.e. the user want to open a capture from 

+	a local interface. This does not involve the RPCAP protocol.

+*/

+#define PCAP_SRC_IFLOCAL 3

+/*!

+	\brief Internal representation of the type of source in use (file, 

+	remote/local interface).

+

+	This indicates a remote interface, i.e. the user want to open a capture from 

+	an interface on a remote host. This does involve the RPCAP protocol.

+*/

+#define PCAP_SRC_IFREMOTE 4

+

+/*!

+	\}

+*/

+

+

+

+/*! \addtogroup remote_source_string

+

+	The formats allowed by the pcap_open() are the following:

+	- file://path_and_filename [opens a local file]

+	- rpcap://devicename [opens the selected device devices available on the local host, without using the RPCAP protocol]

+	- rpcap://host/devicename [opens the selected device available on a remote host]

+	- rpcap://host:port/devicename [opens the selected device available on a remote host, using a non-standard port for RPCAP]

+	- adaptername [to open a local adapter; kept for compability, but it is strongly discouraged]

+	- (NULL) [to open the first local adapter; kept for compability, but it is strongly discouraged]

+

+	The formats allowed by the pcap_findalldevs_ex() are the following:

+	- file://folder/ [lists all the files in the given folder]

+	- rpcap:// [lists all local adapters]

+	- rpcap://host:port/ [lists the devices available on a remote host]

+

+	Referring to the 'host' and 'port' paramters, they can be either numeric or literal. Since

+	IPv6 is fully supported, these are the allowed formats:

+

+	- host (literal): e.g. host.foo.bar

+	- host (numeric IPv4): e.g. 10.11.12.13

+	- host (numeric IPv4, IPv6 style): e.g. [10.11.12.13]

+	- host (numeric IPv6): e.g. [1:2:3::4]

+	- port: can be either numeric (e.g. '80') or literal (e.g. 'http')

+

+	Here you find some allowed examples:

+	- rpcap://host.foo.bar/devicename [everything literal, no port number]

+	- rpcap://host.foo.bar:1234/devicename [everything literal, with port number]

+	- rpcap://10.11.12.13/devicename [IPv4 numeric, no port number]

+	- rpcap://10.11.12.13:1234/devicename [IPv4 numeric, with port number]

+	- rpcap://[10.11.12.13]:1234/devicename [IPv4 numeric with IPv6 format, with port number]

+	- rpcap://[1:2:3::4]/devicename [IPv6 numeric, no port number]

+	- rpcap://[1:2:3::4]:1234/devicename [IPv6 numeric, with port number]

+	- rpcap://[1:2:3::4]:http/devicename [IPv6 numeric, with literal port number]

+	

+	\{

+*/

+

+

+/*!

+	\brief String that will be used to determine the type of source in use (file,

+	remote/local interface).

+

+	This string will be prepended to the interface name in order to create a string

+	that contains all the information required to open the source.

+

+	This string indicates that the user wants to open a capture from a local file.

+*/

+#define PCAP_SRC_FILE_STRING "file://"

+/*!

+	\brief String that will be used to determine the type of source in use (file,

+	remote/local interface).

+

+	This string will be prepended to the interface name in order to create a string

+	that contains all the information required to open the source.

+

+	This string indicates that the user wants to open a capture from a network interface.

+	This string does not necessarily involve the use of the RPCAP protocol. If the

+	interface required resides on the local host, the RPCAP protocol is not involved

+	and the local functions are used.

+*/

+#define PCAP_SRC_IF_STRING "rpcap://"

+

+/*!

+	\}

+*/

+

+

+

+

+

+/*!

+	\addtogroup remote_open_flags

+	\{

+*/

+

+/*!

+	\brief Defines if the adapter has to go in promiscuous mode.

+

+	It is '1' if you have to open the adapter in promiscuous mode, '0' otherwise.

+	Note that even if this parameter is false, the interface could well be in promiscuous

+	mode for some other reason (for example because another capture process with 

+	promiscuous mode enabled is currently using that interface).

+	On on Linux systems with 2.2 or later kernels (that have the "any" device), this

+	flag does not work on the "any" device; if an argument of "any" is supplied,

+	the 'promisc' flag is ignored.

+*/

+#define PCAP_OPENFLAG_PROMISCUOUS		1

+

+/*!

+	\brief Defines if the data trasfer (in case of a remote

+	capture) has to be done with UDP protocol.

+

+	If it is '1' if you want a UDP data connection, '0' if you want

+	a TCP data connection; control connection is always TCP-based.

+	A UDP connection is much lighter, but it does not guarantee that all

+	the captured packets arrive to the client workstation. Moreover, 

+	it could be harmful in case of network congestion.

+	This flag is meaningless if the source is not a remote interface.

+	In that case, it is simply ignored.

+*/

+#define PCAP_OPENFLAG_DATATX_UDP			2

+

+

+/*!

+	\brief Defines if the remote probe will capture its own generated traffic.

+

+	In case the remote probe uses the same interface to capture traffic and to send

+	data back to the caller, the captured traffic includes the RPCAP traffic as well.

+	If this flag is turned on, the RPCAP traffic is excluded from the capture, so that

+	the trace returned back to the collector is does not include this traffic.

+*/

+#define PCAP_OPENFLAG_NOCAPTURE_RPCAP	4

+

+/*!

+	\brief Defines if the local adapter will capture its own generated traffic.

+

+	This flag tells the underlying capture driver to drop the packets that were sent by itself. 

+	This is usefult when building applications like bridges, that should ignore the traffic

+	they just sent.

+*/

+#define PCAP_OPENFLAG_NOCAPTURE_LOCAL	8

+

+/*!

+	\brief This flag configures the adapter for maximum responsiveness.

+

+	In presence of a large value for nbytes, WinPcap waits for the arrival of several packets before 

+	copying the data to the user. This guarantees a low number of system calls, i.e. lower processor usage, 

+	i.e. better performance, which is good for applications like sniffers. If the user sets the 

+	PCAP_OPENFLAG_MAX_RESPONSIVENESS flag, the capture driver will copy the packets as soon as the application 

+	is ready to receive them. This is suggested for real time applications (like, for example, a bridge) 

+	that need the best responsiveness.*/

+#define PCAP_OPENFLAG_MAX_RESPONSIVENESS	16

+

+/*!

+	\}

+*/

+

+

+/*!

+	\addtogroup remote_samp_methods

+	\{

+*/

+

+/*!

+	\brief No sampling has to be done on the current capture.

+

+	In this case, no sampling algorithms are applied to the current capture.

+*/

+#define PCAP_SAMP_NOSAMP	0

+

+/*!

+	\brief It defines that only 1 out of N packets must be returned to the user.

+

+	In this case, the 'value' field of the 'pcap_samp' structure indicates the

+	number of packets (minus 1) that must be discarded before one packet got accepted.

+	In other words, if 'value = 10', the first packet is returned to the caller, while

+	the following 9 are discarded.

+*/

+#define PCAP_SAMP_1_EVERY_N	1

+

+/*!

+	\brief It defines that we have to return 1 packet every N milliseconds.

+

+	In this case, the 'value' field of the 'pcap_samp' structure indicates the 'waiting

+	time' in milliseconds before one packet got accepted.

+	In other words, if 'value = 10', the first packet is returned to the caller; the next 

+	returned one will be the first packet that arrives when 10ms have elapsed. 

+*/

+#define PCAP_SAMP_FIRST_AFTER_N_MS 2

+

+/*!

+	\}

+*/

+

+

+/*!

+	\addtogroup remote_auth_methods

+	\{

+*/

+

+/*!

+	\brief It defines the NULL authentication.

+

+	This value has to be used within the 'type' member of the pcap_rmtauth structure.

+	The 'NULL' authentication has to be equal to 'zero', so that old applications

+	can just put every field of struct pcap_rmtauth to zero, and it does work.

+*/

+#define RPCAP_RMTAUTH_NULL 0

+/*!

+	\brief It defines the username/password authentication.

+

+	With this type of authentication, the RPCAP protocol will use the username/

+	password provided to authenticate the user on the remote machine. If the

+	authentication is successful (and the user has the right to open network devices)

+	the RPCAP connection will continue; otherwise it will be dropped.

+

+	This value has to be used within the 'type' member of the pcap_rmtauth structure.

+*/

+#define RPCAP_RMTAUTH_PWD 1

+

+/*!

+	\}

+*/

+

+

+

+

+/*!

+

+	\brief This structure keeps the information needed to autheticate

+	the user on a remote machine.

+	

+	The remote machine can either grant or refuse the access according 

+	to the information provided.

+	In case the NULL authentication is required, both 'username' and

+	'password' can be NULL pointers.

+	

+	This structure is meaningless if the source is not a remote interface;

+	in that case, the functions which requires such a structure can accept

+	a NULL pointer as well.

+*/

+struct pcap_rmtauth

+{

+	/*!

+		\brief Type of the authentication required.

+

+		In order to provide maximum flexibility, we can support different types

+		of authentication based on the value of this 'type' variable. The currently 

+		supported authentication methods are defined into the

+		\link remote_auth_methods Remote Authentication Methods Section\endlink.

+

+	*/

+	int type;

+	/*!

+		\brief Zero-terminated string containing the username that has to be 

+		used on the remote machine for authentication.

+		

+		This field is meaningless in case of the RPCAP_RMTAUTH_NULL authentication

+		and it can be NULL.

+	*/

+	char *username;

+	/*!

+		\brief Zero-terminated string containing the password that has to be 

+		used on the remote machine for authentication.

+		

+		This field is meaningless in case of the RPCAP_RMTAUTH_NULL authentication

+		and it can be NULL.

+	*/

+	char *password;

+};

+

+

+/*!

+	\brief This structure defines the information related to sampling.

+

+	In case the sampling is requested, the capturing device should read

+	only a subset of the packets coming from the source. The returned packets depend

+	on the sampling parameters.

+

+	\warning The sampling process is applied <strong>after</strong> the filtering process.

+	In other words, packets are filtered first, then the sampling process selects a

+	subset of the 'filtered' packets and it returns them to the caller.

+*/

+struct pcap_samp

+{

+	/*!

+		Method used for sampling. Currently, the supported methods are listed in the

+		\link remote_samp_methods Sampling Methods Section\endlink.

+	*/

+	int method;

+

+	/*!

+		This value depends on the sampling method defined. For its meaning, please check

+		at the \link remote_samp_methods Sampling Methods Section\endlink.

+	*/

+	int value;

+};

+

+

+

+

+//! Maximum lenght of an host name (needed for the RPCAP active mode)

+#define RPCAP_HOSTLIST_SIZE 1024

+

+

+/*!

+	\}

+*/ // end of public documentation

+

+

+// Exported functions

+

+

+

+/** \name New WinPcap functions

+

+	This section lists the new functions that are able to help considerably in writing

+	WinPcap programs because of their easiness of use.

+ */

+//\{

+pcap_t *pcap_open(const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf);

+int pcap_createsrcstr(char *source, int type, const char *host, const char *port, const char *name, char *errbuf);

+int pcap_parsesrcstr(const char *source, int *type, char *host, char *port, char *name, char *errbuf);

+int pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf);

+struct pcap_samp *pcap_setsampling(pcap_t *p);

+

+//\}

+// End of new winpcap functions

+

+

+

+/** \name Remote Capture functions

+ */

+//\{ 

+SOCKET pcap_remoteact_accept(const char *address, const char *port, const char *hostlist, char *connectinghost, struct pcap_rmtauth *auth, char *errbuf);

+int pcap_remoteact_list(char *hostlist, char sep, int size, char *errbuf);

+int pcap_remoteact_close(const char *host, char *errbuf);

+void pcap_remoteact_cleanup();

+//\}

+// End of remote capture functions

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif

+

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/wpcap.lib b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/wpcap.lib
new file mode 100644
index 0000000..f832e04
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/WinPCap/wpcap.lib
Binary files differ
diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/atomic.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/atomic.h
new file mode 100644
index 0000000..565c280
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/atomic.h
@@ -0,0 +1,547 @@
+/*

+ * FreeRTOS Kernel V10.2.0

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/**

+ * @file atomic.h

+ * @brief FreeRTOS atomic operation support.

+ *

+ * Two implementations of atomic are given in this header file:

+ * 1. Disabling interrupt globally.

+ * 2. ISA native atomic support.

+ * The former is available to all ports (compiler-architecture combination),

+ * while the latter is only available to ports compiling with GCC (version at

+ * least 4.7.0), which also have ISA atomic support.

+ *

+ * User can select which implementation to use by:

+ * setting/clearing configUSE_ATOMIC_INSTRUCTION in FreeRTOSConfig.h.

+ * Define AND set configUSE_ATOMIC_INSTRUCTION to 1 for ISA native atomic support.

+ * Undefine OR clear configUSE_ATOMIC_INSTRUCTION for disabling global interrupt

+ * implementation.

+ *

+ * @see GCC Built-in Functions for Memory Model Aware Atomic Operations

+ *      https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

+ */

+

+#ifndef ATOMIC_H

+#define ATOMIC_H

+

+#ifndef INC_FREERTOS_H

+    #error "include FreeRTOS.h must appear in source files before include atomic.h"

+#endif

+

+/* Standard includes. */

+#include <stdint.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    /* Needed for __atomic_compare_exchange() weak=false. */

+    #include <stdbool.h>

+

+    /* This branch is for GCC compiler and GCC compiler only. */

+    #ifndef portFORCE_INLINE

+        #define portFORCE_INLINE  inline __attribute__((always_inline))

+    #endif

+

+#else

+

+    /* Port specific definitions -- entering/exiting critical section.

+     * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h

+     *

+     * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with

+     * ATOMIC_ENTER_CRITICAL().

+     */

+    #if defined( portSET_INTERRUPT_MASK_FROM_ISR )

+

+        /* Nested interrupt scheme is supported in this port. */

+        #define ATOMIC_ENTER_CRITICAL()     \

+            UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR()

+

+        #define ATOMIC_EXIT_CRITICAL()      \

+            portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType )

+

+    #else

+

+        /* Nested interrupt scheme is NOT supported in this port. */

+        #define ATOMIC_ENTER_CRITICAL()     portENTER_CRITICAL()

+        #define ATOMIC_EXIT_CRITICAL()      portEXIT_CRITICAL()

+

+    #endif /* portSET_INTERRUPT_MASK_FROM_ISR() */

+

+    /* Port specific definition -- "always inline". 

+     * Inline is compiler specific, and may not always get inlined depending on your optimization level. 

+     * For atomic operations, inline is considered a performance optimization.

+     * Thus, if portFORCE_INLINE is not provided by portmacro.h, instead of resulting error,

+     * simply define it. 

+     */

+    #ifndef portFORCE_INLINE

+        #define portFORCE_INLINE 

+    #endif

+

+#endif /* configUSE_GCC_BUILTIN_ATOMICS */

+

+#define ATOMIC_COMPARE_AND_SWAP_SUCCESS     0x1U        /**< Compare and swap succeeded, swapped. */

+#define ATOMIC_COMPARE_AND_SWAP_FAILURE     0x0U        /**< Compare and swap failed, did not swap. */

+

+/*----------------------------- Swap && CAS ------------------------------*/

+

+/**

+ * Atomic compare-and-swap

+ *

+ * @brief Performs an atomic compare-and-swap operation on the specified values.

+ *

+ * @param[in, out] pDestination  Pointer to memory location from where value is

+ *                               to be loaded and checked.

+ * @param[in] ulExchange         If condition meets, write this value to memory.

+ * @param[in] ulComparand        Swap condition.

+ *

+ * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.

+ *

+ * @note This function only swaps *pDestination with ulExchange, if previous

+ *       *pDestination value equals ulComparand.

+ */

+static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32(

+        uint32_t volatile * pDestination,

+        uint32_t ulExchange,

+        uint32_t ulComparand )

+{

+

+    uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;

+

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    if ( __atomic_compare_exchange( pDestination,

+                                    &ulComparand,

+                                    &ulExchange,

+                                    false,

+                                    __ATOMIC_SEQ_CST,

+                                    __ATOMIC_SEQ_CST ) )

+    {

+        ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;

+    }

+

+#else

+

+    ATOMIC_ENTER_CRITICAL();

+

+    if ( *pDestination == ulComparand )

+    {

+        *pDestination = ulExchange;

+        ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;

+    }

+

+    ATOMIC_EXIT_CRITICAL();

+

+#endif

+

+    return ulReturnValue;

+

+}

+

+/**

+ * Atomic swap (pointers)

+ *

+ * @brief Atomically sets the address pointed to by *ppDestination to the value

+ *        of *pExchange.

+ *

+ * @param[in, out] ppDestination  Pointer to memory location from where a pointer

+ *                                value is to be loaded and written back to.

+ * @param[in] pExchange           Pointer value to be written to *ppDestination.

+ *

+ * @return The initial value of *ppDestination.

+ */

+static portFORCE_INLINE void * Atomic_SwapPointers_p32(

+        void * volatile * ppDestination,

+        void * pExchange )

+{

+    void * pReturnValue;

+

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    __atomic_exchange( ppDestination, &pExchange, &pReturnValue, __ATOMIC_SEQ_CST );

+

+#else

+

+    ATOMIC_ENTER_CRITICAL();

+

+    pReturnValue = *ppDestination;

+

+    *ppDestination = pExchange;

+

+    ATOMIC_EXIT_CRITICAL();

+

+#endif

+

+    return pReturnValue;

+}

+

+/**

+ * Atomic compare-and-swap (pointers)

+ *

+ * @brief Performs an atomic compare-and-swap operation on the specified pointer

+ *        values.

+ *

+ * @param[in, out] ppDestination  Pointer to memory location from where a pointer

+ *                                value is to be loaded and checked.

+ * @param[in] pExchange           If condition meets, write this value to memory.

+ * @param[in] pComparand          Swap condition.

+ *

+ * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.

+ *

+ * @note This function only swaps *ppDestination with pExchange, if previous

+ *       *ppDestination value equals pComparand.

+ */

+static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32(

+        void * volatile * ppDestination,

+        void * pExchange, void * pComparand )

+{

+    uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;

+

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+    if ( __atomic_compare_exchange( ppDestination,

+                                    &pComparand,

+                                    &pExchange,

+                                    false,

+                                    __ATOMIC_SEQ_CST,

+                                    __ATOMIC_SEQ_CST ) )

+    {

+        ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;

+    }

+

+#else

+

+    ATOMIC_ENTER_CRITICAL();

+

+    if ( *ppDestination == pComparand )

+    {

+        *ppDestination = pExchange;

+        ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;

+    }

+

+    ATOMIC_EXIT_CRITICAL();

+

+#endif

+

+    return ulReturnValue;

+}

+

+

+/*----------------------------- Arithmetic ------------------------------*/

+

+/**

+ * Atomic add

+ *

+ * @brief Atomically adds count to the value of the specified pointer points to.

+ *

+ * @param[in,out] pAddend  Pointer to memory location from where value is to be

+ *                         loaded and written back to.

+ * @param[in] ulCount      Value to be added to *pAddend.

+ *

+ * @return previous *pAddend value.

+ */

+static portFORCE_INLINE uint32_t Atomic_Add_u32(

+        uint32_t volatile * pAddend,

+        uint32_t ulCount )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_add(pAddend, ulCount, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pAddend;

+

+    *pAddend += ulCount;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/**

+ * Atomic subtract

+ *

+ * @brief Atomically subtracts count from the value of the specified pointer

+ *        pointers to.

+ *

+ * @param[in,out] pAddend  Pointer to memory location from where value is to be

+ *                         loaded and written back to.

+ * @param[in] ulCount      Value to be subtract from *pAddend.

+ *

+ * @return previous *pAddend value.

+ */

+static portFORCE_INLINE uint32_t Atomic_Subtract_u32(

+        uint32_t volatile * pAddend,

+        uint32_t ulCount )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_sub(pAddend, ulCount, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pAddend;

+

+    *pAddend -= ulCount;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/**

+ * Atomic increment

+ *

+ * @brief Atomically increments the value of the specified pointer points to.

+ *

+ * @param[in,out] pAddend  Pointer to memory location from where value is to be

+ *                         loaded and written back to.

+ *

+ * @return *pAddend value before increment.

+ */

+static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pAddend )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_add(pAddend, 1, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pAddend;

+

+    *pAddend += 1;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/**

+ * Atomic decrement

+ *

+ * @brief Atomically decrements the value of the specified pointer points to

+ *

+ * @param[in,out] pAddend  Pointer to memory location from where value is to be

+ *                         loaded and written back to.

+ *

+ * @return *pAddend value before decrement.

+ */

+static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pAddend )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_sub(pAddend, 1, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pAddend;

+

+    *pAddend -= 1;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/*----------------------------- Bitwise Logical ------------------------------*/

+

+/**

+ * Atomic OR

+ *

+ * @brief Performs an atomic OR operation on the specified values.

+ *

+ * @param [in, out] pDestination  Pointer to memory location from where value is

+ *                                to be loaded and written back to.

+ * @param [in] ulValue            Value to be ORed with *pDestination.

+ *

+ * @return The original value of *pDestination.

+ */

+static portFORCE_INLINE uint32_t Atomic_OR_u32(

+        uint32_t volatile * pDestination,

+        uint32_t ulValue )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_or(pDestination, ulValue, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pDestination;

+

+    *pDestination |= ulValue;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/**

+ * Atomic AND

+ *

+ * @brief Performs an atomic AND operation on the specified values.

+ *

+ * @param [in, out] pDestination  Pointer to memory location from where value is

+ *                                to be loaded and written back to.

+ * @param [in] ulValue            Value to be ANDed with *pDestination.

+ *

+ * @return The original value of *pDestination.

+ */

+static portFORCE_INLINE uint32_t Atomic_AND_u32(

+        uint32_t volatile * pDestination,

+        uint32_t ulValue )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_and(pDestination, ulValue, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pDestination;

+

+    *pDestination &= ulValue;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/**

+ * Atomic NAND

+ *

+ * @brief Performs an atomic NAND operation on the specified values.

+ *

+ * @param [in, out] pDestination  Pointer to memory location from where value is

+ *                                to be loaded and written back to.

+ * @param [in] ulValue            Value to be NANDed with *pDestination.

+ *

+ * @return The original value of *pDestination.

+ */

+static portFORCE_INLINE uint32_t Atomic_NAND_u32(

+        uint32_t volatile * pDestination,

+        uint32_t ulValue )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_nand(pDestination, ulValue, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pDestination;

+

+    *pDestination = ~(ulCurrent & ulValue);

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+/**

+ * Atomic XOR

+ *

+ * @brief Performs an atomic XOR operation on the specified values.

+ *

+ * @param [in, out] pDestination  Pointer to memory location from where value is

+ *                                to be loaded and written back to.

+ * @param [in] ulValue            Value to be XORed with *pDestination.

+ *

+ * @return The original value of *pDestination.

+ */

+static portFORCE_INLINE uint32_t Atomic_XOR_u32(

+        uint32_t volatile * pDestination,

+        uint32_t ulValue )

+{

+#if defined ( configUSE_GCC_BUILTIN_ATOMICS ) && ( configUSE_GCC_BUILTIN_ATOMICS == 1 )

+

+    return __atomic_fetch_xor(pDestination, ulValue, __ATOMIC_SEQ_CST);

+

+#else

+

+    uint32_t ulCurrent;

+

+    ATOMIC_ENTER_CRITICAL();

+

+    ulCurrent = *pDestination;

+

+    *pDestination ^= ulValue;

+

+    ATOMIC_EXIT_CRITICAL();

+

+    return ulCurrent;

+

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* ATOMIC_H */

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/demo_logging.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/demo_logging.c
new file mode 100644
index 0000000..e22e910
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/demo_logging.c
@@ -0,0 +1,527 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/*

+ * Logging utility that allows FreeRTOS tasks to log to a UDP port, stdout, and

+ * disk file without making any Win32 system calls themselves.

+ *

+ * Messages logged to a UDP port are sent directly (using FreeRTOS+TCP), but as

+ * FreeRTOS tasks cannot make Win32 system calls messages sent to stdout or a

+ * disk file are sent via a stream buffer to a Win32 thread which then performs

+ * the actual output.

+ */

+

+/* Standard includes. */

+#include <stdio.h>

+#include <stdint.h>

+#include <stdarg.h>

+#include <io.h>

+#include <ctype.h>

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+#include "task.h"

+

+/* FreeRTOS+TCP includes. */

+#include "FreeRTOS_IP.h"

+#include "FreeRTOS_Sockets.h"

+#include "FreeRTOS_Stream_Buffer.h"

+

+/* Demo includes. */

+#include "demo_logging.h"

+

+/*-----------------------------------------------------------*/

+

+/* The maximum size to which the log file may grow, before being renamed

+to .ful. */

+#define dlLOGGING_FILE_SIZE		( 40ul * 1024ul * 1024ul )

+

+/* Dimensions the arrays into which print messages are created. */

+#define dlMAX_PRINT_STRING_LENGTH	255

+

+/* The size of the stream buffer used to pass messages from FreeRTOS tasks to

+the Win32 thread that is responsible for making any Win32 system calls that are

+necessary for the selected logging method. */

+#define dlLOGGING_STREAM_BUFFER_SIZE  32768

+

+/* A block time of zero simply means don't block. */

+#define dlDONT_BLOCK	0

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Called from vLoggingInit() to start a new disk log file.

+ */

+static void prvFileLoggingInit( void );

+

+/*

+ * Attempt to write a message to the file.

+ */

+static void prvLogToFile( const char *pcMessage, size_t xLength );

+

+/*

+ * Simply close the logging file, if it is open.

+ */

+static void prvFileClose( void );

+

+/*

+ * Before the scheduler is started this function is called directly.  After the

+ * scheduler has started it is called from the Windows thread dedicated to

+ * outputting log messages.  Only the windows thread actually performs the

+ * writing so as not to disrupt the simulation by making Windows system calls

+ * from FreeRTOS tasks.

+ */

+static void prvLoggingFlushBuffer( void );

+

+/*

+ * The windows thread that performs the actual writing of messages that require

+ * Win32 system calls.  Only the windows thread can make system calls so as not

+ * to disrupt the simulation by making Windows calls from FreeRTOS tasks.

+ */

+static DWORD WINAPI prvWin32LoggingThread( void *pvParam );

+

+/*

+ * Creates the socket to which UDP messages are sent.  This function is not

+ * called directly to prevent the print socket being created from within the IP

+ * task - which could result in a deadlock.  Instead the function call is

+ * deferred to run in the RTOS daemon task - hence it prototype.

+ */

+static void prvCreatePrintSocket( void *pvParameter1, uint32_t ulParameter2 );

+

+/*-----------------------------------------------------------*/

+

+/* Windows event used to wake the Win32 thread which performs any logging that

+needs Win32 system calls. */

+static void *pvLoggingThreadEvent = NULL;

+

+/* Stores the selected logging targets passed in as parameters to the

+vLoggingInit() function. */

+BaseType_t xStdoutLoggingUsed = pdFALSE, xDiskFileLoggingUsed = pdFALSE, xUDPLoggingUsed = pdFALSE;

+

+/* Circular buffer used to pass messages from the FreeRTOS tasks to the Win32

+thread that is responsible for making Win32 calls (when stdout or a disk log is

+used). */

+static StreamBuffer_t *xLogStreamBuffer = NULL;

+

+/* Handle to the file used for logging.  This is left open while there are

+messages waiting to be logged, then closed again in between logs. */

+static FILE *pxLoggingFileHandle = NULL;

+

+/* When true prints are performed directly.  After start up xDirectPrint is set

+to pdFALSE - at which time prints that require Win32 system calls are done by

+the Win32 thread responsible for logging. */

+BaseType_t xDirectPrint = pdTRUE;

+

+/* File names for the in use and complete (full) log files. */

+static const char *pcLogFileName = "RTOSDemo.log";

+static const char *pcFullLogFileName = "RTOSDemo.ful";

+

+/* As an optimization, the current file size is kept in a variable. */

+static size_t ulSizeOfLoggingFile = 0ul;

+

+/* The UDP socket and address on/to which print messages are sent. */

+Socket_t xPrintSocket = FREERTOS_INVALID_SOCKET;

+struct freertos_sockaddr xPrintUDPAddress;

+

+/*-----------------------------------------------------------*/

+

+void vLoggingInit( BaseType_t xLogToStdout, BaseType_t xLogToFile, BaseType_t xLogToUDP, uint32_t ulRemoteIPAddress, uint16_t usRemotePort )

+{

+	/* Can only be called before the scheduler has started. */

+	configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED );

+

+	#if( ( ipconfigHAS_DEBUG_PRINTF == 1 ) || ( ipconfigHAS_PRINTF == 1 ) )

+	{

+		HANDLE Win32Thread;

+

+		/* Record which output methods are to be used. */

+		xStdoutLoggingUsed = xLogToStdout;

+		xDiskFileLoggingUsed = xLogToFile;

+		xUDPLoggingUsed = xLogToUDP;

+

+		/* If a disk file is used then initialize it now. */

+		if( xDiskFileLoggingUsed != pdFALSE )

+		{

+			prvFileLoggingInit();

+		}

+

+		/* If UDP logging is used then store the address to which the log data

+		will be sent - but don't create the socket yet because the network is

+		not initialized. */

+		if( xUDPLoggingUsed != pdFALSE )

+		{

+			/* Set the address to which the print messages are sent. */

+			xPrintUDPAddress.sin_port = FreeRTOS_htons( usRemotePort );

+			xPrintUDPAddress.sin_addr = ulRemoteIPAddress;

+		}

+

+		/* If a disk file or stdout are to be used then Win32 system calls will

+		have to be made.  Such system calls cannot be made from FreeRTOS tasks

+		so create a stream buffer to pass the messages to a Win32 thread, then

+		create the thread itself, along with a Win32 event that can be used to

+		unblock the thread. */

+		if( ( xStdoutLoggingUsed != pdFALSE ) || ( xDiskFileLoggingUsed != pdFALSE ) )

+		{

+			/* Create the buffer. */

+			xLogStreamBuffer = ( StreamBuffer_t * ) malloc( sizeof( *xLogStreamBuffer ) - sizeof( xLogStreamBuffer->ucArray ) + dlLOGGING_STREAM_BUFFER_SIZE + 1 );

+			configASSERT( xLogStreamBuffer );

+			memset( xLogStreamBuffer, '\0', sizeof( *xLogStreamBuffer ) - sizeof( xLogStreamBuffer->ucArray ) );

+			xLogStreamBuffer->LENGTH = dlLOGGING_STREAM_BUFFER_SIZE + 1;

+

+			/* Create the Windows event. */

+			pvLoggingThreadEvent = CreateEvent( NULL, FALSE, TRUE, "StdoutLoggingEvent" );

+

+			/* Create the thread itself. */

+			Win32Thread = CreateThread(

+				NULL,	/* Pointer to thread security attributes. */

+				0,		/* Initial thread stack size, in bytes. */

+				prvWin32LoggingThread,	/* Pointer to thread function. */

+				NULL,	/* Argument for new thread. */

+				0,		/* Creation flags. */

+				NULL );

+

+			/* Use the cores that are not used by the FreeRTOS tasks. */

+			SetThreadAffinityMask( Win32Thread, ~0x01u );

+			SetThreadPriorityBoost( Win32Thread, TRUE );

+			SetThreadPriority( Win32Thread, THREAD_PRIORITY_IDLE );

+		}

+	}

+	#else

+	{

+		/* FreeRTOSIPConfig is set such that no print messages will be output.

+		Avoid compiler warnings about unused parameters. */

+		( void ) xLogToStdout;

+		( void ) xLogToFile;

+		( void ) xLogToUDP;

+		( void ) usRemotePort;

+		( void ) ulRemoteIPAddress;

+	}

+	#endif /* ( ipconfigHAS_DEBUG_PRINTF == 1 ) || ( ipconfigHAS_PRINTF == 1 )  */

+}

+/*-----------------------------------------------------------*/

+

+static void prvCreatePrintSocket( void *pvParameter1, uint32_t ulParameter2 )

+{

+static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 0 );

+Socket_t xSocket;

+

+	/* The function prototype is that of a deferred function, but the parameters

+	are not actually used. */

+	( void ) pvParameter1;

+	( void ) ulParameter2;

+

+	xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );

+

+	if( xSocket != FREERTOS_INVALID_SOCKET )

+	{

+		/* FreeRTOS+TCP decides which port to bind to. */

+		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );

+		FreeRTOS_bind( xSocket, NULL, 0 );

+

+		/* Now the socket is bound it can be assigned to the print socket. */

+		xPrintSocket = xSocket;

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vLoggingPrintf( const char *pcFormat, ... )

+{

+char cPrintString[ dlMAX_PRINT_STRING_LENGTH ];

+char cOutputString[ dlMAX_PRINT_STRING_LENGTH ];

+char *pcSource, *pcTarget, *pcBegin;

+size_t xLength, xLength2, rc;

+static BaseType_t xMessageNumber = 0;

+va_list args;

+uint32_t ulIPAddress;

+const char *pcTaskName;

+const char *pcNoTask = "None";

+int iOriginalPriority;

+HANDLE xCurrentTask;

+

+

+	if( ( xStdoutLoggingUsed != pdFALSE ) || ( xDiskFileLoggingUsed != pdFALSE ) || ( xUDPLoggingUsed != pdFALSE ) )

+	{

+		/* There are a variable number of parameters. */

+		va_start( args, pcFormat );

+

+		/* Additional info to place at the start of the log. */

+		if( xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED )

+		{

+			pcTaskName = pcTaskGetName( NULL );

+		}

+		else

+		{

+			pcTaskName = pcNoTask;

+		}

+

+		if( strcmp( pcFormat, "\n" ) != 0 )

+		{

+			xLength = snprintf( cPrintString, dlMAX_PRINT_STRING_LENGTH, "%lu %lu [%s] ",

+				xMessageNumber++,

+				( unsigned long ) xTaskGetTickCount(),

+				pcTaskName );

+		}

+		else

+		{

+			xLength = 0;

+			memset( cPrintString, 0x00, dlMAX_PRINT_STRING_LENGTH );

+		}

+

+		xLength2 = vsnprintf( cPrintString + xLength, dlMAX_PRINT_STRING_LENGTH - xLength, pcFormat, args );

+

+		if( xLength2 <  0 )

+		{

+			/* Clean up. */

+			xLength2 = dlMAX_PRINT_STRING_LENGTH - 1 - xLength;

+			cPrintString[ dlMAX_PRINT_STRING_LENGTH - 1 ] = '\0';

+		}

+

+		xLength += xLength2;

+		va_end( args );

+

+		/* For ease of viewing, copy the string into another buffer, converting

+		IP addresses to dot notation on the way. */

+		pcSource = cPrintString;

+		pcTarget = cOutputString;

+

+		while( ( *pcSource ) != '\0' )

+		{

+			*pcTarget = *pcSource;

+			pcTarget++;

+			pcSource++;

+

+			/* Look forward for an IP address denoted by 'ip'. */

+			if( ( isxdigit( pcSource[ 0 ] ) != pdFALSE ) && ( pcSource[ 1 ] == 'i' ) && ( pcSource[ 2 ] == 'p' ) )

+			{

+				*pcTarget = *pcSource;

+				pcTarget++;

+				*pcTarget = '\0';

+				pcBegin = pcTarget - 8;

+

+				while( ( pcTarget > pcBegin ) && ( isxdigit( pcTarget[ -1 ] ) != pdFALSE ) )

+				{

+					pcTarget--;

+				}

+

+				sscanf( pcTarget, "%8X", &ulIPAddress );

+				rc = sprintf( pcTarget, "%lu.%lu.%lu.%lu",

+					( unsigned long ) ( ulIPAddress >> 24UL ),

+					( unsigned long ) ( (ulIPAddress >> 16UL) & 0xffUL ),

+					( unsigned long ) ( (ulIPAddress >> 8UL) & 0xffUL ),

+					( unsigned long ) ( ulIPAddress & 0xffUL ) );

+				pcTarget += rc;

+				pcSource += 3; /* skip "<n>ip" */

+			}

+		}

+

+		/* How far through the buffer was written? */

+		xLength = ( BaseType_t ) ( pcTarget - cOutputString );

+

+		/* If the message is to be logged to a UDP port then it can be sent directly

+		because it only uses FreeRTOS function (not Win32 functions). */

+		if( xUDPLoggingUsed != pdFALSE )

+		{

+			if( ( xPrintSocket == FREERTOS_INVALID_SOCKET ) && ( FreeRTOS_IsNetworkUp() != pdFALSE ) )

+			{

+				/* Create and bind the socket to which print messages are sent.  The

+				xTimerPendFunctionCall() function is used even though this is

+				not an interrupt because this function is called from the IP task

+				and the	IP task cannot itself wait for a socket to bind.  The

+				parameters to prvCreatePrintSocket() are not required so set to

+				NULL or 0. */

+				xTimerPendFunctionCall( prvCreatePrintSocket, NULL, 0, dlDONT_BLOCK );

+			}

+

+			if( xPrintSocket != FREERTOS_INVALID_SOCKET )

+			{

+				FreeRTOS_sendto( xPrintSocket, cOutputString, xLength, 0, &xPrintUDPAddress, sizeof( xPrintUDPAddress ) );

+

+				/* Just because the UDP data logger I'm using is dumb. */

+				FreeRTOS_sendto( xPrintSocket, "\r", sizeof( char ), 0, &xPrintUDPAddress, sizeof( xPrintUDPAddress ) );

+			}

+		}

+

+		/* If logging is also to go to either stdout or a disk file then it cannot

+		be output here - so instead write the message to the stream buffer and wake

+		the Win32 thread which will read it from the stream buffer and perform the

+		actual output. */

+		if( ( xStdoutLoggingUsed != pdFALSE ) || ( xDiskFileLoggingUsed != pdFALSE ) )

+		{

+			configASSERT( xLogStreamBuffer );

+

+			/* How much space is in the buffer? */

+			xLength2 = uxStreamBufferGetSpace( xLogStreamBuffer );

+

+			/* There must be enough space to write both the string and the length of

+			the string. */

+			if( xLength2 >= ( xLength + sizeof( xLength ) ) )

+			{

+				/* First write in the length of the data, then write in the data

+				itself.  Raising the thread priority is used as a critical section

+				as there are potentially multiple writers.  The stream buffer is

+				only thread safe when there is a single writer (likewise for

+				reading from the buffer). */

+				xCurrentTask = GetCurrentThread();

+				iOriginalPriority = GetThreadPriority( xCurrentTask );

+				SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL );

+				uxStreamBufferAdd( xLogStreamBuffer, 0, ( const uint8_t * ) &( xLength ), sizeof( xLength ) );

+				uxStreamBufferAdd( xLogStreamBuffer, 0, ( const uint8_t * ) cOutputString, xLength );

+				SetThreadPriority( GetCurrentThread(), iOriginalPriority );

+			}

+

+			/* xDirectPrint is initialized to pdTRUE, and while it remains true the

+			logging output function is called directly.  When the system is running

+			the output function cannot be called directly because it would get

+			called from both FreeRTOS tasks and Win32 threads - so instead wake the

+			Win32 thread responsible for the actual output. */

+			if( xDirectPrint != pdFALSE )

+			{

+				/* While starting up, the thread which calls prvWin32LoggingThread()

+				is not running yet and xDirectPrint will be pdTRUE. */

+				prvLoggingFlushBuffer();

+			}

+			else if( pvLoggingThreadEvent != NULL )

+			{

+				/* While running, wake up prvWin32LoggingThread() to send the

+				logging data. */

+				SetEvent( pvLoggingThreadEvent );

+			}

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvLoggingFlushBuffer( void )

+{

+size_t xLength;

+char cPrintString[ dlMAX_PRINT_STRING_LENGTH ];

+

+	/* Is there more than the length value stored in the circular buffer

+	used to pass data from the FreeRTOS simulator into this Win32 thread? */

+	while( uxStreamBufferGetSize( xLogStreamBuffer ) > sizeof( xLength ) )

+	{

+		memset( cPrintString, 0x00, dlMAX_PRINT_STRING_LENGTH );

+		uxStreamBufferGet( xLogStreamBuffer, 0, ( uint8_t * ) &xLength, sizeof( xLength ), pdFALSE );

+		uxStreamBufferGet( xLogStreamBuffer, 0, ( uint8_t * ) cPrintString, xLength, pdFALSE );

+

+		/* Write the message to standard out if requested to do so when

+		vLoggingInit() was called, or if the network is not yet up. */

+		if( ( xStdoutLoggingUsed != pdFALSE ) || ( FreeRTOS_IsNetworkUp() == pdFALSE ) )

+		{

+			/* Write the message to stdout. */

+			printf( "%s", cPrintString ); /*_RB_ Replace with _write(). */

+			fflush( stdout );

+		}

+

+		/* Write the message to a file if requested to do so when

+		vLoggingInit() was called. */

+		if( xDiskFileLoggingUsed != pdFALSE )

+		{

+			prvLogToFile( cPrintString, xLength );

+		}

+	}

+

+	prvFileClose();

+}

+/*-----------------------------------------------------------*/

+

+static DWORD WINAPI prvWin32LoggingThread( void *pvParameter )

+{

+const DWORD xMaxWait = 1000;

+

+	( void ) pvParameter;

+

+	/* From now on, prvLoggingFlushBuffer() will only be called from this

+	Windows thread */

+	xDirectPrint = pdFALSE;

+

+	for( ;; )

+	{

+		/* Wait to be told there are message waiting to be logged. */

+		WaitForSingleObject( pvLoggingThreadEvent, xMaxWait );

+

+		/* Write out all waiting messages. */

+		prvLoggingFlushBuffer();

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvFileLoggingInit( void )

+{

+FILE *pxHandle = fopen( pcLogFileName, "a" );

+

+	if( pxHandle != NULL )

+	{

+		fseek( pxHandle, SEEK_END, 0ul );

+		ulSizeOfLoggingFile = ftell( pxHandle );

+		fclose( pxHandle );

+	}

+	else

+	{

+		ulSizeOfLoggingFile = 0ul;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvFileClose( void )

+{

+	if( pxLoggingFileHandle != NULL )

+	{

+		fclose( pxLoggingFileHandle );

+		pxLoggingFileHandle = NULL;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvLogToFile( const char *pcMessage, size_t xLength )

+{

+	if( pxLoggingFileHandle == NULL )

+	{

+		pxLoggingFileHandle = fopen( pcLogFileName, "a" );

+	}

+

+	if( pxLoggingFileHandle != NULL )

+	{

+		fwrite( pcMessage, 1, xLength, pxLoggingFileHandle );

+		ulSizeOfLoggingFile += xLength;

+

+		/* If the file has grown to its maximum permissible size then close and

+		rename it - then start with a new file. */

+		if( ulSizeOfLoggingFile > ( size_t ) dlLOGGING_FILE_SIZE )

+		{

+			prvFileClose();

+			if( _access( pcFullLogFileName, 00 ) == 0 )

+			{

+				remove( pcFullLogFileName );

+			}

+			rename( pcLogFileName, pcFullLogFileName );

+			ulSizeOfLoggingFile = 0;

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/demo_logging.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/demo_logging.h
new file mode 100644
index 0000000..197b216
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/demo_logging.h
@@ -0,0 +1,48 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+#ifndef DEMO_LOGGING_H

+#define DEMO_LOGGING_H

+

+/*

+ * Initialize a logging system that can be used from FreeRTOS tasks and Win32

+ * threads.  Do not call printf() directly while the scheduler is running.

+ *

+ * Set xLogToStdout, xLogToFile and xLogToUDP to either pdTRUE or pdFALSE to

+ * lot to stdout, a disk file and a UDP port respectively.

+ *

+ * If xLogToUDP is pdTRUE then ulRemoteIPAddress and usRemotePort must be set

+ * to the IP address and port number to which UDP log messages will be sent.

+ */

+void vLoggingInit(	BaseType_t xLogToStdout,

+					BaseType_t xLogToFile,

+					BaseType_t xLogToUDP,

+					uint32_t ulRemoteIPAddress,

+					uint16_t usRemotePort );

+

+#endif /* DEMO_LOGGING_H */

+

diff --git a/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/main.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/main.c
new file mode 100644
index 0000000..3c531b6
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/main.c
@@ -0,0 +1,369 @@
+/*

+ * FreeRTOS Kernel V10.2.1

+ * Copyright (C) 2019 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/***

+ * See https://www.FreeRTOS.org/mqtt/index.html for configuration and usage instructions.

+ ***/

+

+/* Standard includes. */

+#include <stdio.h>

+#include <time.h>

+

+/* Visual studio intrinsics used so the __debugbreak() function is available

+should an assert get hit. */

+#include <intrin.h>

+

+/* FreeRTOS includes. */

+#include <FreeRTOS.h>

+#include "task.h"

+

+/* TCP/IP stack includes. */

+#include "FreeRTOS_IP.h"

+#include "FreeRTOS_Sockets.h"

+

+/* Demo app includes. */

+#include "demo_logging.h"

+

+/*

+ * Prototypes for the demos that can be started from this project.  Note the

+ * MQTT demo is not actually started until the network is already, which is

+ * indicated by vApplicationIPNetworkEventHook() executing - hence

+ * prvStartSimpleMQTTDemo() is called from inside vApplicationIPNetworkEventHook().

+ */

+extern void vStartSimpleMQTTDemo( void );

+

+/*

+ * Task for Light Weight MQTT Serializer API Proof of Concept.

+ * To run the proof of concept instead of the demo replace

+ * vStartSimpleMQTTDemo() with vApplicationIPNetworkEventHook()

+ * in function vApplicationIPNetworkEventHook().

+ */

+extern void vStartLightWeightMQTTDemo( 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 echo server

+address (see the configECHO_SERVER_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 };

+

+/* Use by the pseudo random number generator. */

+static UBaseType_t ulNextRand;

+/*-----------------------------------------------------------*/

+

+int main( void )

+{

+	/***

+	 * See https://www.FreeRTOS.org/mqtt/index.html 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. */

+			configPRINTF( ( "---------STARTING DEMO---------\r\n" ) );

+			vStartSimpleMQTTDemo();

+			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 );

+		FreeRTOS_printf( ( "\r\n\r\nIP Address: %s\r\n", cBuffer ) ); /*_RB_ Should use IoT libraries logging. */

+

+		FreeRTOS_inet_ntoa( ulNetMask, cBuffer );

+		FreeRTOS_printf( ( "Subnet Mask: %s\r\n", cBuffer ) );

+

+		FreeRTOS_inet_ntoa( ulGatewayAddress, cBuffer );

+		FreeRTOS_printf( ( "Gateway Address: %s\r\n", cBuffer ) );

+

+		FreeRTOS_inet_ntoa( ulDNSServerAddress, cBuffer );

+		FreeRTOS_printf( ( "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( configECHO_SERVER_ADDR0, configECHO_SERVER_ADDR1, configECHO_SERVER_ADDR2, configECHO_SERVER_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 );

+	FreeRTOS_debug_printf( ( "Seed for randomizer: %lu\n", xTimeNow ) );

+	prvSRand( ( uint32_t ) xTimeNow );

+	FreeRTOS_debug_printf( ( "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();

+}

+/*-----------------------------------------------------------*/

+

+/* 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-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/mbedtls_config.h b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/mbedtls_config.h
new file mode 100644
index 0000000..0f2861a
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/mbedtls_config.h
@@ -0,0 +1,126 @@
+/*

+ * Copyright (C) 2019 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.

+ */

+

+/* 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-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/printf-stdarg.c b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/printf-stdarg.c
new file mode 100644
index 0000000..5505535
--- /dev/null
+++ b/FreeRTOS-Labs/Demo/FreeRTOS_IoT_Libraries/mqtt/common/printf-stdarg.c
@@ -0,0 +1,667 @@
+/*

+	Copyright 2001, 2002 Georges Menie (www.menie.org)

+	stdarg version contributed by Christian Ettinger

+

+	This program is free software; you can redistribute it and/or modify

+	it under the terms of the GNU Lesser General Public License as published by

+	the Free Software Foundation; either version 2 of the License, or

+	(at your option) any later version.

+

+	Changes for the FreeRTOS ports:

+

+	- The dot in "%-8.8s"

+	- The specifiers 'l' (long) and 'L' (long long)

+	- The specifier 'u' for unsigned

+	- Dot notation for IP addresses:

+	  sprintf("IP = %xip\n", 0xC0A80164);

+      will produce "IP = 192.168.1.100\n"

+*/

+

+#include <stdarg.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+

+#include "FreeRTOS.h"

+

+#define PAD_RIGHT 1

+#define PAD_ZERO 2

+

+/*

+ * Return 1 for readable, 2 for writeable, 3 for both.

+ * Function must be provided by the application.

+ */

+extern BaseType_t xApplicationMemoryPermissions( uint32_t aAddress );

+

+extern void vOutputChar( const char cChar, const TickType_t xTicksToWait  );

+static const TickType_t xTicksToWait = pdMS_TO_TICKS( 20 );

+

+struct xPrintFlags

+{

+	int base;

+	int width;

+	int printLimit;

+	unsigned

+		pad : 8,

+		letBase : 8,

+		isSigned : 1,

+		isNumber : 1,

+		long32 : 1,

+		long64 : 1;

+};

+

+struct SStringBuf

+{

+	char *str;

+	const char *orgStr;

+	const char *nulPos;

+	int curLen;

+	struct xPrintFlags flags;

+};

+

+static void strbuf_init( struct SStringBuf *apStr, char *apBuf, const char *apMaxStr )

+{

+	apStr->str = apBuf;

+	apStr->orgStr = apBuf;

+	apStr->nulPos = apMaxStr-1;

+	apStr->curLen = 0;

+

+	memset( &apStr->flags, '\0', sizeof( apStr->flags ) );

+}

+/*-----------------------------------------------------------*/

+

+static BaseType_t strbuf_printchar( struct SStringBuf *apStr, int c )

+{

+	if( apStr->str == NULL )

+	{

+		vOutputChar( ( char ) c, xTicksToWait );

+		apStr->curLen++;

+		return pdTRUE;

+	}

+	if( apStr->str < apStr->nulPos )

+	{

+		*( apStr->str++ ) = c;

+		apStr->curLen++;

+		return pdTRUE;

+	}

+	if( apStr->str == apStr->nulPos )

+	{

+		*( apStr->str++ ) = '\0';

+	}

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portINLINE BaseType_t strbuf_printchar_inline( struct SStringBuf *apStr, int c )

+{

+	if( apStr->str == NULL )

+	{

+		vOutputChar( ( char ) c, xTicksToWait );

+		if( c == 0 )

+		{

+			return pdFALSE;

+		}

+		apStr->curLen++;

+		return pdTRUE;

+	}

+	if( apStr->str < apStr->nulPos )

+	{

+		*(apStr->str++) = c;

+		if( c == 0 )

+		{

+			return pdFALSE;

+		}

+		apStr->curLen++;

+		return pdTRUE;

+	}

+	if( apStr->str == apStr->nulPos )

+	{

+		*( apStr->str++ ) = '\0';

+	}

+	return pdFALSE;

+}

+/*-----------------------------------------------------------*/

+

+static portINLINE int i2hex( int aCh )

+{

+int iResult;

+

+	if( aCh < 10 )

+	{

+		iResult = '0' + aCh;

+	}

+	else

+	{

+		iResult = 'A' + aCh - 10;

+	}

+

+	return iResult;

+}

+/*-----------------------------------------------------------*/

+

+static BaseType_t prints(struct SStringBuf *apBuf, const char *apString )

+{

+	register int padchar = ' ';

+	int i,len;

+

+	if( xApplicationMemoryPermissions( ( uint32_t )apString ) == 0 )

+	{

+		/* The user has probably made a mistake with the parameter

+		for '%s', the memory is not readbale. */

+		apString = "INV_MEM";

+	}

+

+	if( apBuf->flags.width > 0 )

+	{

+		register int len = 0;

+		register const char *ptr;

+		for( ptr = apString; *ptr; ++ptr )

+		{

+			++len;

+		}

+

+		if( len >= apBuf->flags.width )

+		{

+			apBuf->flags.width = 0;

+		}

+		else

+		{

+			apBuf->flags.width -= len;

+		}

+

+		if( apBuf->flags.pad & PAD_ZERO )

+		{

+			padchar = '0';

+		}

+	}

+	if( ( apBuf->flags.pad & PAD_RIGHT ) == 0 )

+	{

+		for( ; apBuf->flags.width > 0; --apBuf->flags.width )

+		{

+			if( strbuf_printchar( apBuf, padchar ) == 0 )

+			{

+				return pdFALSE;

+			}

+		}

+	}

+	if( ( apBuf->flags.isNumber == pdTRUE ) && ( apBuf->flags.pad == pdTRUE ) )

+	{

+		/* The string to print represents an integer number.

+		 * In this case, printLimit is the min number of digits to print

+		 * If the length of the number to print is less than the min nb of i

+		 * digits to display, we add 0 before printing the number

+		 */

+		len = strlen( apString );

+

+		if( len < apBuf->flags.printLimit )

+		{

+			i = apBuf->flags.printLimit - len;

+			for( ; i; i-- )

+			{

+				if( strbuf_printchar( apBuf, '0' )  == 0 )

+				{

+					return pdFALSE;

+				}

+			}

+		}

+	}

+	/* The string to print is not the result of a number conversion to ascii.

+	 * For a string, printLimit is the max number of characters to display

+	 */

+	for( ; apBuf->flags.printLimit && *apString ; ++apString, --apBuf->flags.printLimit )

+	{

+		if( !strbuf_printchar( apBuf, *apString ) )

+		{

+			return pdFALSE;

+		}

+	}

+

+	for( ; apBuf->flags.width > 0; --apBuf->flags.width )

+	{

+		if( !strbuf_printchar( apBuf, padchar ) )

+		{

+			return pdFALSE;

+		}

+	}

+

+	return pdTRUE;

+}

+/*-----------------------------------------------------------*/

+

+/* the following should be enough for 32 bit int */

+#define PRINT_BUF_LEN 12	/* to print 4294967296 */

+

+#if	SPRINTF_LONG_LONG

+#warning 64-bit libraries will be included as well

+static BaseType_t printll( struct SStringBuf *apBuf, long long i )

+{

+	char print_buf[ 2 * PRINT_BUF_LEN ];

+	register char *s;

+	register int t, neg = 0;

+	register unsigned long long u = i;

+	lldiv_t lldiv_result;

+

+/* typedef struct

+ * {

+ * 	long long int quot; // quotient

+ * 	long long int rem;  // remainder

+ * } lldiv_t;

+ */

+

+	apBuf->flags.isNumber = pdTRUE;	/* Parameter for prints */

+	if( i == 0LL )

+	{

+		print_buf[ 0 ] = '0';

+		print_buf[ 1 ] = '\0';

+		return prints( apBuf, print_buf );

+	}

+

+	if( ( apBuf->flags.isSigned == pdTRUE ) && ( apBuf->flags.base == 10 ) && ( i < 0LL ) )

+	{

+		neg = 1;

+		u = -i;

+	}

+

+	s = print_buf + sizeof( print_buf ) - 1;

+

+	*s = '\0';

+	/* 18446744073709551616 */

+	while( u != 0 )

+	{

+		lldiv_result = lldiv( u, ( unsigned long long ) apBuf->flags.base );

+		t = lldiv_result.rem;

+		if( t >= 10 )

+		{

+			t += apBuf->flags.letBase - '0' - 10;

+		}

+		*( --s ) = t + '0';

+		u = lldiv_result.quot;

+	}

+

+	if( neg != 0 )

+	{

+		if( ( apBuf->flags.width != 0 ) && ( apBuf->flags.pad & PAD_ZERO ) )

+		{

+			if( !strbuf_printchar( apBuf, '-' ) )

+			{

+				return pdFALSE;

+			}

+			--apBuf->flags.width;

+		}

+		else

+		{

+			*( --s ) = '-';

+		}

+	}

+

+	return prints( apBuf, s );

+}

+#endif	/* SPRINTF_LONG_LONG */

+/*-----------------------------------------------------------*/

+

+static BaseType_t printi( struct SStringBuf *apBuf, int i )

+{

+	char print_buf[ PRINT_BUF_LEN ];

+	register char *s;

+	register int t, neg = 0;

+	register unsigned int u = i;

+	register unsigned base = apBuf->flags.base;

+

+	apBuf->flags.isNumber = pdTRUE;	/* Parameter for prints */

+

+	if( i == 0 )

+	{

+		print_buf[ 0 ] = '0';

+		print_buf[ 1 ] = '\0';

+		return prints( apBuf, print_buf );

+	}

+

+	if( ( apBuf->flags.isSigned == pdTRUE ) && ( base == 10 ) && ( i < 0 ) )

+	{

+		neg = 1;

+		u = -i;

+	}

+

+	s = print_buf + sizeof( print_buf ) - 1;

+

+	*s = '\0';

+	switch( base )

+	{

+	case 16:

+		while( u != 0 )

+		{

+			t = u & 0xF;

+			if( t >= 10 )

+			{

+				t += apBuf->flags.letBase - '0' - 10;

+			}

+			*( --s ) = t + '0';

+			u >>= 4;

+		}

+		break;

+

+	case 8:

+	case 10:

+		/* GCC compiles very efficient */

+		while( u )

+		{

+			t = u % base;

+			*( --s ) = t + '0';

+			u /= base;

+		}

+		break;

+/*

+	// The generic case, not yet in use

+	default:

+		while( u )

+		{

+			t = u % base;

+			if( t >= 10)

+			{

+				t += apBuf->flags.letBase - '0' - 10;

+			}

+			*( --s ) = t + '0';

+			u /= base;

+		}

+		break;

+*/

+	}

+

+	if( neg != 0 )

+	{

+		if( apBuf->flags.width && (apBuf->flags.pad & PAD_ZERO ) )

+		{

+			if( strbuf_printchar( apBuf, '-' ) == 0 )

+			{

+				return pdFALSE;

+			}

+			--apBuf->flags.width;

+		}

+		else

+		{

+			*( --s ) = '-';

+		}

+	}

+

+	return prints( apBuf, s );

+}

+/*-----------------------------------------------------------*/

+

+static BaseType_t printIp(struct SStringBuf *apBuf, unsigned i )

+{

+	char print_buf[16];

+

+	sprintf( print_buf, "%u.%u.%u.%u",

+		i >> 24,

+		( i >> 16 ) & 0xff,

+		( i >> 8 ) & 0xff,

+		i & 0xff );

+	apBuf->flags.isNumber = pdTRUE;	/* Parameter for prints */

+	prints( apBuf, print_buf );

+

+	return pdTRUE;

+}

+/*-----------------------------------------------------------*/

+

+static void tiny_print( struct SStringBuf *apBuf, const char *format, va_list args )

+{

+	char scr[2];

+

+	for( ; ; )

+	{

+		int ch = *( format++ );

+

+		if( ch != '%' )

+		{

+			do

+			{

+				/* Put the most like flow in a small loop */

+				if( strbuf_printchar_inline( apBuf, ch ) == 0 )

+				{

+					return;

+				}

+				ch = *( format++ );

+			} while( ch != '%' );

+		}

+		ch = *( format++ );

+		/* Now ch has character after '%', format pointing to next */

+

+		if( ch == '\0' )

+		{

+			break;

+		}

+		if( ch == '%' )

+		{

+			if( strbuf_printchar( apBuf, ch ) == 0 )

+			{

+				return;

+			}

+			continue;

+		}

+		memset( &apBuf->flags, '\0', sizeof( apBuf->flags ) );

+

+		if( ch == '-' )

+		{

+			ch = *( format++ );

+			apBuf->flags.pad = PAD_RIGHT;

+		}

+		while( ch == '0' )

+		{

+			ch = *( format++ );

+			apBuf->flags.pad |= PAD_ZERO;

+		}

+		if( ch == '*' )

+		{

+			ch = *( format++ );

+			apBuf->flags.width = va_arg( args, int );

+		}

+		else

+		{

+			while( ch >= '0' && ch <= '9' )

+			{

+				apBuf->flags.width *= 10;

+				apBuf->flags.width += ch - '0';

+				ch = *( format++ );

+			}

+		}

+		if( ch == '.' )

+		{

+			ch = *( format++ );

+			if( ch == '*' )

+			{

+				apBuf->flags.printLimit = va_arg( args, int );

+				ch = *( format++ );

+			}

+			else

+			{

+				while( ch >= '0' && ch <= '9' )

+				{

+					apBuf->flags.printLimit *= 10;

+					apBuf->flags.printLimit += ch - '0';

+					ch = *( format++ );

+				}

+			}

+		}

+		if( apBuf->flags.printLimit == 0 )

+		{

+			apBuf->flags.printLimit--;  /* -1: make it unlimited */

+		}

+		if( ch == 's' )

+		{

+			register char *s = ( char * )va_arg( args, int );

+			if( prints( apBuf, s ? s : "(null)" ) == 0 )

+			{

+				break;

+			}

+			continue;

+		}

+		if( ch == 'c' )

+		{

+			/* char are converted to int then pushed on the stack */

+			scr[0] = ( char ) va_arg( args, int );

+

+			if( strbuf_printchar( apBuf, scr[0] )  == 0 )

+			{

+				return;

+			}

+

+			continue;

+		}

+		if( ch == 'l' )

+		{

+			ch = *( format++ );

+			apBuf->flags.long32 = 1;

+			/* Makes not difference as u32 == long */

+		}

+		if( ch == 'L' )

+		{

+			ch = *( format++ );

+			apBuf->flags.long64 = 1;

+			/* Does make a difference */

+		}

+		apBuf->flags.base = 10;

+		apBuf->flags.letBase = 'a';

+

+		if( ch == 'd' || ch == 'u' )

+		{

+			apBuf->flags.isSigned = ( ch == 'd' );

+#if	SPRINTF_LONG_LONG

+			if( apBuf->flags.long64 != pdFALSE )

+			{

+				if( printll( apBuf, va_arg( args, long long ) ) == 0 )

+				{

+					break;

+				}

+			} else

+#endif	/* SPRINTF_LONG_LONG */

+			if( printi( apBuf, va_arg( args, int ) ) == 0 )

+			{

+				break;

+			}

+			continue;

+		}

+

+		apBuf->flags.base = 16;		/* From here all hexadecimal */

+

+		if( ch == 'x' && format[0] == 'i' && format[1] == 'p' )

+		{

+			format += 2;	/* eat the "xi" of "xip" */

+			/* Will use base 10 again */

+			if( printIp( apBuf, va_arg( args, int ) ) == 0 )

+			{

+				break;

+			}

+			continue;

+		}

+		if( ch == 'x' || ch == 'X' || ch == 'p' || ch == 'o' )

+		{

+			if( ch == 'X' )

+			{

+				apBuf->flags.letBase = 'A';

+			}

+			else if( ch == 'o' )

+			{

+				apBuf->flags.base = 8;

+			}

+#if	SPRINTF_LONG_LONG

+			if( apBuf->flags.long64 != pdFALSE )

+			{

+				if( printll( apBuf, va_arg( args, long long ) ) == 0 )

+				{

+					break;

+				}

+			} else

+#endif	/* SPRINTF_LONG_LONG */

+			if( printi( apBuf, va_arg( args, int ) ) == 0 )

+			{

+				break;

+			}

+			continue;

+		}

+	}

+	strbuf_printchar( apBuf, '\0' );

+}

+/*-----------------------------------------------------------*/

+

+int vsnprintf( char *apBuf, size_t aMaxLen, const char *apFmt, va_list args )

+{

+	struct SStringBuf strBuf;

+	strbuf_init( &strBuf, apBuf, ( const char* )apBuf + aMaxLen );

+	tiny_print( &strBuf, apFmt, args );

+

+	return strBuf.curLen;

+}

+/*-----------------------------------------------------------*/

+

+int snprintf( char *apBuf, size_t aMaxLen, const char *apFmt, ... )

+{

+	va_list args;

+

+	va_start( args,  apFmt );

+	struct SStringBuf strBuf;

+	strbuf_init( &strBuf, apBuf, ( const char* )apBuf + aMaxLen );

+	tiny_print( &strBuf, apFmt, args );

+	va_end( args );

+

+	return strBuf.curLen;

+}

+/*-----------------------------------------------------------*/

+

+int sprintf( char *apBuf, const char *apFmt, ... )

+{

+	va_list args;

+

+	va_start( args,  apFmt );

+	struct SStringBuf strBuf;

+	strbuf_init( &strBuf, apBuf, ( const char * )apBuf + 1024 );

+	tiny_print( &strBuf, apFmt, args );

+	va_end( args );

+

+	return strBuf.curLen;

+}

+/*-----------------------------------------------------------*/

+

+int vsprintf( char *apBuf, const char *apFmt, va_list args )

+{

+	struct SStringBuf strBuf;

+	strbuf_init( &strBuf, apBuf, ( const char* ) apBuf + 1024 );

+	tiny_print( &strBuf, apFmt, args );

+

+	return strBuf.curLen;

+}

+/*-----------------------------------------------------------*/

+

+const char *mkSize (unsigned long long aSize, char *apBuf, int aLen)

+{

+static char retString[33];

+size_t gb, mb, kb, sb;

+

+	if (apBuf == NULL) {

+		apBuf = retString;

+		aLen = sizeof( retString );

+	}

+	gb = aSize / (1024*1024*1024);

+	aSize -= gb * (1024*1024*1024);

+	mb = aSize / (1024*1024);

+	aSize -= mb * (1024*1024);

+	kb = aSize / (1024);

+	aSize -= kb * (1024);

+	sb = aSize;

+	if( gb )

+	{

+		snprintf (apBuf, aLen, "%u.%02u GB", ( unsigned ) gb, ( unsigned ) ( ( 100 * mb ) / 1024ul ) );

+	}

+	else if( mb )

+	{

+		snprintf (apBuf, aLen, "%u.%02u MB", ( unsigned ) mb, ( unsigned ) ( ( 100 * kb) / 1024ul ) );

+	}

+	else if( kb != 0ul )

+	{

+		snprintf (apBuf, aLen, "%u.%02u KB", ( unsigned ) kb, ( unsigned ) ( ( 100 * sb) / 1024ul ) );

+	}

+	else

+	{

+		snprintf (apBuf, aLen, "%u bytes", ( unsigned ) sb);

+	}

+	return apBuf;

+}