[Feature][MD310EU][task-view-1009] Create MD310EU project code directory

Change-Id: I57cd3c474efe4493ae8a242d7e2fa643ad8ecbde
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.c b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.c
new file mode 100755
index 0000000..baa02dc
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.c
@@ -0,0 +1,166 @@
+/*******************************************************************************

+ * Copyright (c) 2014, 2017 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation

+ *    Ian Craggs - return codes from linux_read

+ *******************************************************************************/

+

+#include "MQTTLinux.h"

+

+void TimerInit(Timer* timer)

+{

+	timer->end_time = (struct timeval){0, 0};

+}

+

+char TimerIsExpired(Timer* timer)

+{

+	struct timeval now, res;

+	gettimeofday(&now, NULL);

+	timersub(&timer->end_time, &now, &res);

+	return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);

+}

+

+

+void TimerCountdownMS(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout / 1000, (timeout % 1000) * 1000};

+	timeradd(&now, &interval, &timer->end_time);

+}

+

+

+void TimerCountdown(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout, 0};

+	timeradd(&now, &interval, &timer->end_time);

+}

+

+

+int TimerLeftMS(Timer* timer)

+{

+	struct timeval now, res;

+	gettimeofday(&now, NULL);

+	timersub(&timer->end_time, &now, &res);

+	//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);

+	return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;

+}

+

+

+int linux_read(Network* n, unsigned char* buffer, int len, int timeout_ms)

+{

+	struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};

+	if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))

+	{

+		interval.tv_sec = 0;

+		interval.tv_usec = 100;

+	}

+

+	setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));

+

+	int bytes = 0;

+	while (bytes < len)

+	{

+		int rc = recv(n->my_socket, &buffer[bytes], (size_t)(len - bytes), 0);

+		if (rc == -1)

+		{

+			if (errno != EAGAIN && errno != EWOULDBLOCK)

+			  bytes = -1;

+			break;

+		}

+		else if (rc == 0)

+		{

+			bytes = 0;

+			break;

+		}

+		else

+			bytes += rc;

+	}

+	return bytes;

+}

+

+

+int linux_write(Network* n, unsigned char* buffer, int len, int timeout_ms)

+{

+	struct timeval tv;

+

+	tv.tv_sec = 0;  /* 30 Secs Timeout */

+	tv.tv_usec = timeout_ms * 1000;  // Not init'ing this can cause strange errors

+

+	setsockopt(n->my_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));

+	int	rc = write(n->my_socket, buffer, len);

+	return rc;

+}

+

+

+void NetworkInit(Network* n)

+{

+	n->my_socket = 0;

+	n->mqttread = linux_read;

+	n->mqttwrite = linux_write;

+}

+

+

+int NetworkConnect(Network* n, char* addr, int port)

+{

+	int type = SOCK_STREAM;

+	struct sockaddr_in address;

+	int rc = -1;

+	sa_family_t family = AF_INET;

+	struct addrinfo *result = NULL;

+	struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};

+

+	if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)

+	{

+		struct addrinfo* res = result;

+

+		/* prefer ip4 addresses */

+		while (res)

+		{

+			if (res->ai_family == AF_INET)

+			{

+				result = res;

+				break;

+			}

+			res = res->ai_next;

+		}

+

+		if (result->ai_family == AF_INET)

+		{

+			address.sin_port = htons(port);

+			address.sin_family = family = AF_INET;

+			address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;

+		}

+		else

+			rc = -1;

+

+		freeaddrinfo(result);

+	}

+

+	if (rc == 0)

+	{

+		n->my_socket = socket(family, type, 0);

+		if (n->my_socket != -1)

+			rc = connect(n->my_socket, (struct sockaddr*)&address, sizeof(address));

+	}

+

+	return rc;

+}

+

+

+void NetworkDisconnect(Network* n)

+{

+	close(n->my_socket);

+}