Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/mbtk_mqtt/MQTTLinux.c b/mbtk/mbtk_mqtt/MQTTLinux.c
new file mode 100755
index 0000000..cdfd548
--- /dev/null
+++ b/mbtk/mbtk_mqtt/MQTTLinux.c
@@ -0,0 +1,204 @@
+/*******************************************************************************

+ * Copyright (c) 2014 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

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

+// #include <openssl/ssl.h>

+// #include <openssl/err.h>

+#include "MQTTLinux.h"

+//#include "global.h"

+//#include "DC_iot_port.h"

+#include "mbtk_sock2.h"

+#define TIMEOUT 60*1000

+

+char expired(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 countdown_ms(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 countdown(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout, 0};

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

+}

+

+

+int left_ms(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;

+}

+

+

+void InitTimer(Timer* timer)

+{

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

+}

+

+

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

+{

+

+    int err;

+    int read_len = mbtk_sock_read(n->handle,n->my_socket, buffer, len, TIMEOUT, &err);

+    if(read_len < 0) {

+        if(err == MBTK_SOCK_ETIMEOUT) {

+            return -2;

+        } else {

+            return -1;

+        }

+    } else {

+        return read_len;

+    }

+

+

+

+#if 0

+

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

+	//mDEBUG("[%s]timeout_ms = %d \n", __FUNCTION__, timeout_ms);

+	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);

+		//mDEBUG("[%s]socket recv rc = %d \n", __FUNCTION__, rc);

+

+		if(rc == 0)

+		{

+			 //mDEBUG("[%s]socket close \n", __FUNCTION__);

+			 bytes = 0;

+			 break;

+		}

+		

+		if (rc == -1)

+		{

+			if (errno != ENOTCONN && errno != ECONNRESET)

+			{

+				bytes = -1;

+				break;

+			}

+		}

+		else

+			bytes += rc;

+	}

+	return bytes;

+#endif

+}

+

+

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

+{

+

+    int err;

+    printf("Write[%d]:%s",len,(char*)buffer);

+    return mbtk_sock_write(n->handle, n->my_socket, buffer, len, TIMEOUT, &err);

+

+#if 0

+	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_RCVTIMEO, (char *)&tv,sizeof(struct timeval));

+

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

+

+	return rc;

+#endif

+}

+

+

+void linux_disconnect(Network* n)

+{

+    int errno;

+    mbtk_sock_close(n->handle,n->my_socket,TIMEOUT,&errno);

+}

+

+

+void NewNetwork(Network* n)

+{

+

+	n->my_socket = 0;

+	n->mqttread = linux_read;

+	n->mqttwrite = linux_write;

+	n->disconnect = linux_disconnect;

+    n->ingnore_cert = true;

+    n->is_support_ssl = false;

+}

+

+

+int ConnectNetwork(Network* n, char* addr, int port, bool is_support_ssl, bool ingnore_cert)

+{

+    mbtk_init_info *info ;

+    mbtk_sock_info *sock_info;

+    int rc = 0;

+    int errno;

+    info = NULL;

+    sock_info = (mbtk_sock_info *)malloc(sizeof(mbtk_sock_info));

+    if(sock_info ==NULL)

+    {

+        rc = -1;

+        return rc;

+    }

+    memcpy(sock_info->address, addr, strlen(addr));

+    sock_info->port = port;

+    sock_info->is_support_ssl = is_support_ssl;

+    sock_info->ingnore_cert = ingnore_cert;

+

+    printf("host %s\nport %d\nis_support_ssl %d\ningnore_cert %d\n",sock_info->address,sock_info->port,sock_info->is_support_ssl,sock_info->ingnore_cert);

+

+	mbtk_sock_handle handle = mbtk_sock_init(info);

+    if (handle < 0 )

+    {

+        rc = -1;

+        return rc;

+    }

+

+    int fd  = mbtk_sock_open(handle, sock_info, TIMEOUT, &errno);

+    if(fd < 0)

+    {

+        rc = -1;

+        return rc;

+    }

+

+    n->my_socket = fd;

+    n->handle = handle;

+	return rc;

+}