Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/mbtk_lib/src/mbtk_net_control.c b/mbtk/mbtk_lib/src/mbtk_net_control.c
new file mode 100755
index 0000000..ff3af08
--- /dev/null
+++ b/mbtk/mbtk_lib/src/mbtk_net_control.c
@@ -0,0 +1,535 @@
+/*************************************************************
+Description:
+    C file for network control.
+Author:
+    LiuBin
+Date:
+    2019/7/24 17:13:06
+*************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/un.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <linux/route.h>
+#include <cutils/properties.h>
+#include <telephony/ril.h>
+
+#include "mbtk_type.h"
+#include "mbtk_net_control.h"
+#include "mbtk_task.h"
+#include "mbtk_utils.h"
+#include "mbtk_str.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "mbtk_net_control"
+#include "mbtk_log.h"
+
+/*************************************************************
+    Constants and Macros
+*************************************************************/
+#define NET_CONTROL_BUF_SIZE 1024
+#ifndef INFTIM
+#define INFTIM          (-1)    /* infinite poll timeout */
+#endif
+#define MBTK_NET_PING_HOST "223.5.5.5"
+#define MBTK_NET_PING_IP "180.97.33.107" // IP for www.baidu.com
+
+// #define MBTK_NET_MONITOR_SUPPORT
+
+/*************************************************************
+    Variables:local
+*************************************************************/
+static char net_interface[20];
+static char net_ip[20];
+static mbtk_net_state_t net_state = MBTK_NET_STATE_OFF;
+static bool net_control_thread_running = FALSE;
+
+#ifdef MBTK_NET_MONITOR_SUPPORT
+static pthread_t net_control_thread_id = -1;
+static int net_control_fd = -1;
+#endif
+
+/*************************************************************
+    Variables:public
+*************************************************************/
+
+
+/*************************************************************
+    Local Function Declaration
+*************************************************************/
+
+
+/*************************************************************
+    Local Function Definitions
+*************************************************************/
+// Test network connected?
+// ping www.baidu.com
+static bool net_connected(const char *inf)
+{
+    char cmd[100];
+    char cmd_rsp[100];
+
+    // IP get now, ping www.baidu.com
+    memset(cmd,0,100);
+    snprintf(cmd,100,
+             "ping -I %s -c1 -s0 -w1000 %s | grep \"8 bytes from \"",
+             inf,
+             MBTK_NET_PING_HOST);
+    if(!mbtk_cmd_line(cmd,cmd_rsp,100))
+    {
+        LOGE("ping www.baidu.com cmd error.");
+        return FALSE;
+    }
+
+    LOGI("cmd_rsp:%s",cmd_rsp);
+    // ping www.baidu.com success.
+    if(str_startwith(cmd_rsp, "8 bytes from "))
+    {
+        return TRUE;
+    }
+#if 0
+    else if(str_contains(cmd_rsp, "unknown host"))
+    {
+        // DNS error,ping IP angin.
+        memset(cmd,0,100);
+        snprintf(cmd,100,
+                 "ping -I %s -c1 -s0 -w1000 %s | grep \"8 bytes from \"",
+                 inf,
+                 MBTK_NET_PING_IP);
+        if(!mbtk_cmd_line(cmd,cmd_rsp,100))
+        {
+            LOGW("ping www.baidu.com IP cmd error.");
+            return FALSE;
+        }
+
+        if(str_startwith(cmd_rsp, "8 bytes from "))
+        {
+            return TRUE;
+        }
+        else
+        {
+            LOGW("Network unconnected.(ping baidu IP fail)");
+            return FALSE;
+        }
+    }
+#endif
+    else
+    {
+        LOGW("Network unconnected.(ping baidu host fail)");
+        return FALSE;
+    }
+
+    LOGW("ifconfig cmd fail.");
+    return FALSE;
+}
+
+#ifdef MBTK_NET_MONITOR_SUPPORT
+static int net_control_netlink_init()
+{
+    struct sockaddr_nl sa;
+    int len = 2048;
+
+    net_control_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+    if(net_control_fd < 0)
+    {
+        LOGE("socket() fail.[%d]",errno);
+        return -1;
+    }
+
+    if(setsockopt(net_control_fd,
+                  SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)) < 0)
+    {
+        LOGE("setsockopt() fail.[%d]",errno);
+        return -1;
+    }
+
+    bzero(&sa, sizeof(sa));
+    sa.nl_family = AF_NETLINK;
+    sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE /*| RTMGRP_IPV6_IFADDR | RTMGRP_IPV6_ROUTE*/;
+    if(bind(net_control_fd,
+            (struct sockaddr *) &sa, sizeof(sa)) < 0)
+    {
+        LOGE("bind() fail.[%d]",errno);
+        return -1;
+    }
+
+    return 0;
+}
+
+static void net_control_if_change(struct nlmsghdr *nh)
+{
+    struct rtattr *tb[IFLA_MAX + 1];
+    struct ifinfomsg *ifinfo;
+    bzero(tb, sizeof(tb));
+    if(nh == NULL)
+    {
+        LOGE("mbtk_net_if_change() nh == NULL");
+        return;
+    }
+
+    ifinfo = NLMSG_DATA(nh);
+    if(ifinfo == NULL)
+    {
+        LOGE("mbtk_net_if_change() ifinfo == NULL");
+        return;
+    }
+
+    LOGD("nlmsghdr:%d,%d,%d,%d,%d\n",nh->nlmsg_len,
+         nh->nlmsg_type,
+         nh->nlmsg_flags,
+         nh->nlmsg_seq,
+         nh->nlmsg_pid);
+
+    LOGD("ifinfomsg:%d,%d,%d,%d,%d,%d\n",ifinfo->ifi_family,
+         ifinfo->__ifi_pad,
+         ifinfo->ifi_type,
+         ifinfo->ifi_index,
+         ifinfo->ifi_flags,
+         ifinfo->ifi_change);
+
+    if((ifinfo->ifi_flags & IFF_RUNNING)
+       && (ifinfo->ifi_flags & IFF_LOWER_UP))
+    {
+        LOGD("Wired inserted.");
+    }
+    else
+    {
+        LOGD("Wired not insert.");
+    }
+}
+
+static void net_control_addr_change(struct nlmsghdr *nh)
+{
+    if(nh == NULL)
+    {
+        LOGE("mbtk_net_if_change() nh == NULL");
+        return;
+    }
+
+    if(nh->nlmsg_type==RTM_NEWADDR)
+    {
+        LOGD("New addr...");
+    }
+    else
+    {
+        LOGD("Del addr...");
+    }
+}
+
+static void* net_control_monitor_run(void *arg)
+{
+    LOGI("net_control_monitor_run start.");
+    if(net_control_netlink_init() < 0)
+    {
+        LOGE("mbtk_net_monitor_run() fail.");
+        return ((void*)0);
+    }
+
+    fd_set rd_set;
+    struct timeval timeout;
+    int select_r;
+    int read_r;
+    struct sockaddr_nl sa;
+    struct nlmsghdr *nh;
+    char buff[NET_CONTROL_BUF_SIZE];
+
+    while (net_control_thread_running)
+    {
+        FD_ZERO(&rd_set);
+        FD_SET(net_control_fd, &rd_set);
+        timeout.tv_sec = 5;
+        timeout.tv_usec = 0;
+        select_r = select(net_control_fd + 1, &rd_set, NULL, NULL, &timeout);
+        if (select_r < 0)
+        {
+            perror("select");
+        }
+        else if (select_r > 0)
+        {
+            if (FD_ISSET(net_control_fd, &rd_set))
+            {
+                read_r = read(net_control_fd, buff, NET_CONTROL_BUF_SIZE);
+                LOGI("Net change:read len:%d",read_r);
+
+                int i;
+                for(i = 0; i < 32 && i < read_r; i++)
+                    LOGI("data:%x",buff[i]);
+
+                for (nh = (struct nlmsghdr *) buff; NLMSG_OK(nh, read_r); nh = NLMSG_NEXT(nh, read_r))
+                {
+                    LOGI("msg_type:%d",nh->nlmsg_type);
+                    switch (nh->nlmsg_type)
+                    {
+                        default:
+                            LOGI("nh->nlmsg_type = %d\n", nh->nlmsg_type);
+                            break;
+                        case NLMSG_DONE:
+                        case NLMSG_ERROR:
+                            break;
+                        case RTM_NEWLINK:
+                        case RTM_DELLINK:
+                            net_control_if_change(nh);
+                            break;
+                        case RTM_NEWADDR:
+                        case RTM_DELADDR:
+                            net_control_addr_change(nh);
+                            break;
+                        case RTM_NEWROUTE:
+                        case RTM_DELROUTE:
+                            //print_rtmsg(nh);
+                            break;
+                    }
+
+                }
+            }
+        }
+    }
+
+    LOGD("mbtk_net_monitor_run exist ...");
+
+    return ((void*)0);
+}
+
+static mbtk_task_info net_control_thread =
+{
+    .task_id = &net_control_thread_id,
+    .thread_run = net_control_monitor_run,
+    .args = NULL
+};
+#endif
+
+static int net_control_interface_init()
+{
+    // seth_ltex
+    int i = 0;
+    int size = 0;
+    char result[NET_CONTROL_BUF_SIZE];
+    char cmd[100];
+    int index = 0;
+    while(i <= 7)
+    {
+        size = snprintf(cmd, 100,"ifconfig ccinet%d", i);
+        cmd[size] = '\0';
+        memset(result,0x0,NET_CONTROL_BUF_SIZE);
+        if(mbtk_cmd_line(cmd, result, NET_CONTROL_BUF_SIZE))
+        {
+            index = str_indexof(result,"inet addr:");
+            if(index > 0)
+            {
+                size = snprintf(net_interface, 20,"ccinet%d", i);
+                net_interface[size] = '\0';
+
+                memcpy(net_ip,result + index + 10,20);
+
+                char *ptr = net_ip;
+                while(*ptr && *ptr != ' ')
+                {
+                    ptr++;
+                }
+                *ptr = '\0';
+                break;
+            }
+        }
+        i++;
+    }
+
+    LOGI("Interface : %s, IP : %s",net_interface,net_ip);
+    if(index )
+    {
+        return 0;
+    }
+    else{
+        return -1;
+    }
+}
+
+static int net_control_init()
+{
+//    if(net_control_thread_running)
+//    {
+//        LOGD("Network control has inited.");
+//        return 0;
+//    }
+
+    memset(net_ip,0x0,20);
+    memset(net_interface,0x0,20);
+    if( net_control_interface_init())
+        return -1;
+    net_control_thread_running = TRUE;
+
+#ifdef MBTK_NET_MONITOR_SUPPORT
+    if(mbtk_task_start(&net_control_thread))
+    {
+        LOGE("Create thread fail.");
+        net_control_thread_id = -1;
+        net_control_thread_running = FALSE;
+        return -1;
+    }
+#endif
+    LOGI("net_control_init() success.");
+    return 0;
+}
+
+static int net_control_state_change(bool enable)
+{
+    int size;
+    char result[NET_CONTROL_BUF_SIZE];
+    char cmd[100];
+    if(enable)
+    {
+        // ifconfig seth_lte1 up
+        // ip route add default via 10.94.251.205 dev seth_lte1
+        size = snprintf(cmd,100,"ifconfig %s up",net_interface);
+        cmd[size] = '\0';
+
+        if(mbtk_cmd_line(cmd, result, NET_CONTROL_BUF_SIZE))
+        {
+            size = snprintf(cmd,100,"ip route add default via %s dev %s",net_ip,net_interface);
+            cmd[size] = '\0';
+
+            if(mbtk_cmd_line(cmd, result, NET_CONTROL_BUF_SIZE))
+            {
+                net_state = MBTK_NET_STATE_CONN;
+                return 0;
+            }
+        }
+    }
+    else
+    {
+        // ifconfig seth_lte1 down
+        size = snprintf(cmd,100,"ifconfig %s down",net_interface);
+        cmd[size] = '\0';
+
+        if(mbtk_cmd_line(cmd, result, NET_CONTROL_BUF_SIZE))
+        {
+            net_state = MBTK_NET_STATE_OFF;
+            return 0;
+        }
+    }
+
+    return -1;
+}
+
+/*************************************************************
+    Public Function Definitions
+*************************************************************/
+/*=============================================
+FUNCTION
+    mbtk_net_state_get()
+
+DESCRIPTION
+    Get network state.
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    None
+
+RETURN VALUE
+    Current network state.
+
+SIDE EFFECTS
+    None
+=============================================*/
+mbtk_net_state_t mbtk_net_state_get()
+{
+    net_control_init();
+
+    net_state = MBTK_NET_STATE_OFF;
+    if(strlen(net_ip) > 0)
+    {
+        if(net_connected(net_interface))
+            net_state = MBTK_NET_STATE_CONN;
+    }
+
+    LOGI("[GET]Net state:%d",net_state);
+
+    if(net_state == MBTK_NET_STATE_CONN)
+    {
+        char value[PROPERTY_VALUE_MAX] = {0};
+        if (property_get("persist.mbtk.netstate", value, "0,0") > 0 && strcmp(value,"0,0")) {
+            int regStatus = 0, gprsState = 0;
+            char *ptr = value;
+            regStatus = atoi(ptr);
+            if((ptr = strstr(ptr, ",")))
+            {
+                gprsState = atoi(ptr + 1);
+            }
+
+            LOGI("regStatus : %d, gprsState : %d", regStatus, gprsState);
+            if(regStatus != 1 && regStatus != 5)   // Not Home/Roaming Network.
+            {
+                net_state = MBTK_NET_STATE_CONN_UNKNOWN;
+            }
+            else
+            {
+                if (gprsState == RADIO_TECH_LTE || gprsState == RADIO_TECH_LTEP)
+                {
+                    net_state = MBTK_NET_STATE_CONN_4G;
+                }
+                else if ((gprsState == RADIO_TECH_GPRS) || (gprsState == RADIO_TECH_EDGE) || (gprsState == RADIO_TECH_GSM))
+                {
+                    net_state = MBTK_NET_STATE_CONN_2G;
+                } else if((gprsState == RADIO_TECH_UMTS) || (gprsState == RADIO_TECH_HSDPA)
+                         || (gprsState == RADIO_TECH_HSUPA) || (gprsState == RADIO_TECH_HSPA)) {
+                    net_state = MBTK_NET_STATE_CONN_3G;
+                } else {
+                    net_state = MBTK_NET_STATE_CONN_UNKNOWN;
+                }
+            }
+        }
+        else
+        {
+            LOGE("property_get persist.mbtk.netstate fail.");
+            net_state = MBTK_NET_STATE_CONN_UNKNOWN;
+            goto end;
+        }
+    }
+
+end:
+    return net_state;
+}
+
+/*=============================================
+FUNCTION
+    mbtk_net_enable()
+
+DESCRIPTION
+    Set network state.
+
+DEPENDENCIES
+    None
+
+PARAMETERS
+    enable
+        TRUE : Enable network.
+        FALSE: Diable network.
+
+RETURN VALUE
+    0 : Success
+    -1: Fail
+
+SIDE EFFECTS
+    None
+=============================================*/
+int mbtk_net_enable(bool enable)
+{
+    if( net_control_init())
+        return -1;
+
+    int result = net_control_state_change(enable);
+
+    LOGI("[SET]Net state:%d",net_state);
+
+    return result;
+}
+