Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/ql_lib/src/ql_data_call.c b/mbtk/ql_lib/src/ql_data_call.c
new file mode 100755
index 0000000..5f88b55
--- /dev/null
+++ b/mbtk/ql_lib/src/ql_data_call.c
@@ -0,0 +1,530 @@
+#include "ql/DSI_ConnectManager.h"
+#include "mbtk_info_api.h"
+
+extern mbtk_info_handle_t* ql_info_handle;
+extern int ql_info_handle_num;
+static bool inited = FALSE;
+
+typedef struct
+{
+    bool active;
+    uint8 cid;
+    int ip_type;
+    char user[128];
+    char pass[128];
+    QL_DSI_AUTH_PREF_T auth;
+} apn_info;
+
+// 2 - 7
+static apn_info ql_apn_info[9]={0};
+static int mbtk_interval_sec = 0;
+static nw_status_cb ql_net_status_cb = NULL;
+static ex_conn_status_cb ql_net_ex_status_cb = NULL;
+
+void ql_wan_net_state_change_cb(const void* data, int data_len)
+{
+    uint8 *net_data = NULL;
+    net_data = (uint8 *)data;
+
+    if(ql_net_status_cb != NULL)
+    {
+        if(*net_data > 100 && *net_data < 200)
+        {
+            int cid;
+            cid = *net_data;
+            cid = cid - 100;
+            ql_apn_info[cid].active = FALSE;//close
+        }
+        else if(*net_data > 200)
+        {
+            int cid;
+            cid = *net_data;
+            cid = cid - 200;
+            ql_apn_info[cid].active = TRUE;//open
+        }
+        else
+        {
+            ql_net_status_cb(*net_data);
+
+            if(*net_data == 25 || *net_data == 26 || *net_data == 27)
+            {
+                ql_net_status_cb(CONNECT_CONSUCCESS);
+            }
+        }
+    }
+    else
+    {
+        //ql_netw_status_cb(-1);
+    }
+}
+
+int ql_wan_init(void)
+{
+    if(!inited && ql_info_handle == NULL)
+    {
+        ql_info_handle = mbtk_info_handle_get();
+        if(ql_info_handle)
+        {
+            ql_info_handle_num++;
+            inited = TRUE;
+            mbtk_pdp_state_change_cb_reg(ql_info_handle, ql_wan_net_state_change_cb);
+            return 0;
+        } else {
+            LOGE("mbtk_info_handle_get() fail.");
+            return -1;
+        }
+    } else {
+        if(!inited) {
+            ql_info_handle_num++;
+            inited = TRUE;
+            mbtk_pdp_state_change_cb_reg(ql_info_handle, ql_wan_net_state_change_cb);
+        }
+        return 0;
+    }
+}
+
+int ql_wan_release(void)
+{
+    if(ql_info_handle)
+    {
+        LOGD("ql_info_handle_num = %d", ql_info_handle_num);
+        if(ql_info_handle_num == 1) { // 最后一个引用,可释放。
+            int ret = mbtk_info_handle_free(&ql_info_handle);
+            if(ret) {
+                LOGE("mbtk_info_handle_free() fail.");
+                return -1;
+            }
+            else
+            {
+                ql_info_handle_num = 0;
+                ql_info_handle = NULL;
+                return 0;
+            }
+        } else {
+            ql_info_handle_num--;
+            return 0;
+        }
+    }
+    else
+    {
+        LOGE("DATA handle not inited.");
+        return -1;
+    }
+}
+/*
+*Set data call over time.
+*/
+int ql_wan_set_autoconnect(int auto_status, int interval_sec)
+{
+    if(auto_status == 0)                    //不开启失败重连
+        mbtk_interval_sec = 0;
+    else                                    //开启失败重连等待时间
+    {
+        if(interval_sec <= 0)
+            mbtk_interval_sec = interval_sec;
+        else
+            mbtk_interval_sec = 5; // 默认为5s
+    }
+    return 0;
+}
+
+int ql_wan_start_ex(int profile_idx, int op, ex_conn_status_cb nw_cb)
+{
+    int ret = -1;
+    int count = 0;
+    if(ql_info_handle == NULL)
+    {
+        return -1;
+    }
+
+    ql_net_ex_status_cb = nw_cb;
+    if(profile_idx < MBTK_APN_CID_MIN || profile_idx > MBTK_APN_CID_MAX)
+    {
+        LOGD("ql_wan_start_ex() cid out of range.");
+#if 0 //mbtk wyq for data_call add "if 0"
+        if(ql_net_ex_status_cb)
+            ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type ,PDP_ERROR_UNSPECIFIED, 0);
+#endif
+        return -1;
+    }
+
+#if 0 //mbtk wyq for data_call add "if 0"
+    //ql_netw_status_cb(ql_apn_info[profile_idx].cid);
+    if(op == 0)
+    {
+        ret = ql_wan_stop(profile_idx);
+        goto exit;
+    }
+
+    if(ql_apn_info[profile_idx].active)
+    {
+        if(ql_net_ex_status_cb)
+            ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type, PDP_CID_EXIST_FAIL, 0);
+        return -1;
+    }
+
+    if(ql_net_ex_status_cb) {
+        ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type, CONNECT_DIAL_IMMEDIATELY, 0);
+        ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type, CONNECT_CONNING, 0);
+    }
+    
+data_call_continue:
+#endif
+    ret = mbtk_data_call_start(ql_info_handle, profile_idx, mbtk_interval_sec, op == 1 ? TRUE : FALSE, 0);
+    if(ret != 0)
+    {
+#if 0 //mbtk wyq for data_call add "if 0"
+        if(mbtk_interval_sec <= 0)
+        {
+            if(ql_net_ex_status_cb)
+                ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type, CONNECT_DISCON, 0);
+            return ret;
+        }
+        else
+        {
+            if(count >= 5)
+                goto exit;
+            sleep(mbtk_interval_sec);
+            count++;
+            if(ql_net_ex_status_cb)
+                ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type, CONNECT_REDIAL, 0);
+            goto data_call_continue;
+        }
+#endif
+        LOGD("mbtk_data_call_start() fail.");
+    }
+    else
+    {
+        //ql_apn_info[8].cid=profile_idx;
+        //ql_netw_status_cb(CONNECT_CONSUCCESS);
+        LOGD("mbtk_data_call_start() success.");
+    }
+exit:
+    return ret;
+}
+
+
+/*
+* Start data call.
+*/
+int ql_wan_start(int profile_idx, int op, nw_status_cb nw_cb)
+{
+    int ret = -1;
+    int count = 0;
+    if(ql_info_handle == NULL)
+    {
+        return -1;
+    }
+
+    ql_net_status_cb = nw_cb;
+    if(profile_idx < MBTK_APN_CID_MIN || profile_idx > MBTK_APN_CID_MAX)
+    {
+        ql_net_status_cb(PDP_ERROR_UNSPECIFIED);
+        return -1;
+    }
+
+    //ql_netw_status_cb(ql_apn_info[profile_idx].cid);
+    if(op == 0)
+    {
+        ret = ql_wan_stop(profile_idx);
+        goto exit;
+    }
+
+    if(ql_apn_info[profile_idx].active)
+    {
+        ql_net_status_cb(PDP_CID_EXIST_FAIL);
+        return -1;
+    }
+
+    ql_net_status_cb(CONNECT_DIAL_IMMEDIATELY);
+    ql_net_status_cb(CONNECT_CONNING);
+data_call_continue:
+    ret = mbtk_data_call_start(ql_info_handle, profile_idx, mbtk_interval_sec, op == 3 ? TRUE : FALSE, 0);
+    if(ret != 0)
+    {
+        if(mbtk_interval_sec <= 0)
+        {
+            ql_net_status_cb(CONNECT_DISCON);
+            return ret;
+        }
+        else
+        {
+            if(count >= 5)
+                goto exit;
+            sleep(mbtk_interval_sec);
+            count++;
+            ql_net_status_cb(CONNECT_REDIAL);
+            goto data_call_continue;
+        }
+    }
+    else
+    {
+        //ql_apn_info[8].cid=profile_idx;
+        //ql_netw_status_cb(CONNECT_CONSUCCESS);
+        LOGD("mbtk_data_call_start() success.");
+    }
+exit:
+    return ret;
+}
+
+/*
+* Stop data call.
+*/
+int ql_wan_stop(int profile_idx)
+{
+    int err;
+    if(ql_info_handle == NULL)
+    {
+        return -1;
+    }
+    if(profile_idx < MBTK_APN_CID_MIN || profile_idx > MBTK_APN_CID_MAX)
+    {
+        LOGE("CID error.");
+        return -1;
+    }
+
+#if 0 //mbtk wyq for data_call add "if 0"
+    if(!ql_apn_info[profile_idx].active)
+    {
+        if(ql_net_ex_status_cb)
+            ql_net_ex_status_cb(profile_idx, ql_apn_info[profile_idx].ip_type ,PDP_CID_EXIST_FAIL, 0);
+        if(ql_net_status_cb)
+            ql_net_status_cb(PDP_CID_EXIST_FAIL);
+        return -1;
+    }
+#endif
+    err = mbtk_data_call_stop(ql_info_handle, profile_idx, 15);
+
+    return err;
+}
+
+/*
+* Query data call state.
+*/
+int ql_get_data_call_info(int profile_idx, ql_data_call_info *info)
+{
+    if(ql_info_handle == NULL || info == NULL)
+    {
+        return -1;
+    }
+    if(profile_idx < MBTK_APN_CID_MIN || profile_idx > MBTK_APN_CID_MAX)
+    {
+        LOGE("CID error.");
+        return -1;
+    }
+    mbtk_ipv4_info_t ipv4;
+    mbtk_ipv6_info_t ipv6;
+    memset(info, 0, sizeof(ql_data_call_info));
+    int ret = mbtk_data_call_state_get(ql_info_handle, profile_idx, &ipv4, &ipv6);
+    if(ret != 0)
+        return -1;
+    else
+    {
+        info->profile_idx = profile_idx;
+        if(ipv4.valid)
+        {
+            info->ip_type = 1; // IPV4
+            info->v4.state = 1;
+            sprintf(info->v4.addr.name, "ccinet%d", profile_idx - 1);
+            if(inet_ntop(AF_INET, &(ipv4.IPAddr), info->v4.addr.ip, 32) == NULL) {
+                LOGD("IP error.");
+            } else {
+                LOGD("IP : %s", info->v4.addr.ip);
+            }
+            if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), info->v4.addr.pri_dns, 32) == NULL) {
+                LOGD("PrimaryDNS error.");
+            } else {
+                LOGD("PrimaryDNS : %s", info->v4.addr.pri_dns);
+            }
+            if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), info->v4.addr.sec_dns, 32) == NULL) {
+                LOGD("SecondaryDNS error.");
+            } else {
+                LOGD("SecondaryDNS : %s", info->v4.addr.sec_dns);
+            }
+        }
+        if(ipv6.valid)
+        {
+            info->ip_type = 2; // IPV6
+            info->v6.state = 1;
+            sprintf(info->v6.addr.name, "ccinet%d", profile_idx - 1);
+			if(ipv6_2_str(&(ipv6.IPV6Addr), info->v6.addr.ip))
+            {
+				LOGD("IP error.");
+			} else {
+				LOGD("IP : %s", info->v6.addr.ip);
+			}
+			if(ipv6_2_str(&(ipv6.PrimaryDNS), info->v6.addr.pri_dns))
+            {
+				LOGD("PrimaryDNS error.");
+			} else {
+				LOGD("PrimaryDNS : %s", info->v6.addr.pri_dns);
+			}
+			if(ipv6_2_str(&(ipv6.SecondaryDNS), info->v6.addr.sec_dns))
+            {
+				LOGD("SecondaryDNS error.");
+			} else {
+				LOGD("SecondaryDNS : %s", info->v6.addr.sec_dns);
+			}
+        }
+        if(ipv4.valid && ipv6.valid)
+            info->ip_type = 0; // IPV4V6
+        if(!ipv4.valid && !ipv6.valid)
+        {
+            info->v4.state = 0;
+            info->v6.state = 0;
+        }
+        return 0;
+    }
+
+}
+
+/*
+* Set specific APN informations.
+*
+* cid : 2-7
+*/
+int ql_wan_setapn(int profile_idx, int ip_type, const char *apn, const char *userName,
+                            const char *password, QL_DSI_AUTH_PREF_T auth)
+{
+    if(ql_info_handle == NULL)
+    {
+        return -1;
+    }
+    if(profile_idx < MBTK_APN_CID_MIN || profile_idx > MBTK_APN_CID_MAX)
+    {
+        LOGE("CID error.");
+        return -1;
+    }
+    /*
+     QL_DSI_AUTH_PREF_NULL = 0,         //无认证
+     QL_DSI_AUTH_PREF_ONLY_PAP,         //PAP 认证
+     QL_DSI_AUTH_PREF_ONLY_CHAP,        //CHAP 认证
+     QL_DSI_AUTH_PREF_BOTH_PAP_CHAP     //PAP 和 CHAP 认证
+    */
+    char mbtk_auth[64]={0};
+    if(auth == QL_DSI_AUTH_PREF_NULL)
+        memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
+    else if(auth == QL_DSI_AUTH_PREF_ONLY_PAP)
+        memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
+    else if(auth == QL_DSI_AUTH_PREF_ONLY_CHAP)
+        memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
+    else
+    {
+        LOGD("auth input error!");
+        return -1;
+    }
+
+    memset(&(ql_apn_info[profile_idx]), 0, sizeof(apn_info));
+    ql_apn_info[profile_idx].cid = profile_idx;
+    ql_apn_info[profile_idx].ip_type = ip_type;
+    if(!str_empty(userName) && !str_empty(password)) {
+        memcpy(ql_apn_info[profile_idx].user, userName, strlen(userName));
+        memcpy(ql_apn_info[profile_idx].pass, password, strlen(password));
+        ql_apn_info[profile_idx].auth = auth;
+        LOGD("ql_wan_setapn: %d, %d, %s, %s, %s, %s",profile_idx, ip_type, apn, userName, password, mbtk_auth);
+    } else {
+        LOGD("ql_wan_setapn: %d, %d, %s, NULL, NULL, %s",profile_idx, ip_type, apn, mbtk_auth);
+    }
+
+     /*
+    if(ip_type < 0 || ip_type > 3)
+        ql_netw_status_cb(PDP_UNKNOWN_PDP_ADDRESS_TYPE);
+    */
+    if(ip_type == 0) // IPV4V6
+        ip_type = MBTK_IP_TYPE_IPV4V6;
+    else if(ip_type == 1) // IPV4
+        ip_type = MBTK_IP_TYPE_IP;
+    else if(ip_type == 2) // IPV6
+        ip_type = MBTK_IP_TYPE_IPV6;
+
+    return mbtk_apn_set(ql_info_handle, profile_idx, ip_type, apn, userName, password, mbtk_auth);
+}
+
+/*
+* Get current all APN informations.
+*/
+int __ql_wan_getapn(int profile_idx, int *ip_type, char *apn, int apnLen, char *userName, int userLen, char *password, int pwdLen,int* auth)
+{
+    if(ql_info_handle == NULL || apn == NULL)
+    {
+        return -1;
+    }
+    if(profile_idx < MBTK_APN_CID_MIN || profile_idx > MBTK_APN_CID_MAX)
+    {
+        LOGE("CID error.");
+        return -1;
+    }
+    mbtk_apn_info_t apns[10];
+    int apn_num = MBTK_APN_CID_MAX;
+    int ret = mbtk_apn_get(ql_info_handle, &apn_num, apns);
+    if(ret != 0)
+    {
+        LOGD("mbtk_apn_get ret = %d",ret);
+        return -1;
+    }
+    else
+    {
+        int i;
+        for(i=0;i<MBTK_APN_CID_MAX;i++)
+        {
+            if(apns[i].cid == profile_idx)
+                break;
+        }
+        if(i == MBTK_APN_CID_MAX)
+            return -1;
+        LOGD("cid = %d",i);
+        if(apns[i].ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
+            *ip_type = 0;
+        else if(apns[i].ip_type == MBTK_IP_TYPE_IP) // IPV4
+            *ip_type = 1;
+        else if(apns[i].ip_type == MBTK_IP_TYPE_IPV6) // IPV6
+            *ip_type = 2;
+        else
+            *ip_type = 0;
+
+        if(strlen(apns[i].apn)+1 > apnLen)
+            return -1;
+        else
+            memcpy(apn, apns[i].apn,strlen(apns[i].apn)+1);
+
+        if(strlen(apns[i].user)+1 > userLen)
+            return -1;
+        else
+        {
+            if(strlen(apns[i].user) > 0)
+                memcpy(userName, apns[i].user, strlen(apns[i].user)+1);
+            else
+                memcpy(userName, ql_apn_info[profile_idx].user, strlen(ql_apn_info[profile_idx].user)+1);
+        }
+
+        if(strlen(apns[i].pass)+1 > pwdLen)
+            return -1;
+        else
+        {
+            if(strlen(apns[i].pass) > 0)
+                memcpy(password, apns[i].pass, strlen(apns[i].pass)+1);
+            else
+                memcpy(password, ql_apn_info[profile_idx].pass, strlen(ql_apn_info[profile_idx].pass)+1);
+        }
+
+        if(strlen(apns[i].auth) > 0) {
+            if(strcmp(apns[i].auth, "NONE") == 0)
+                *auth = QL_DSI_AUTH_PREF_NULL;
+            else if(strcmp(apns[i].auth, "PAP") == 0)
+                *auth = QL_DSI_AUTH_PREF_ONLY_PAP;
+            else if(strcmp(apns[i].auth, "CHAP") == 0)
+                *auth = QL_DSI_AUTH_PREF_ONLY_CHAP;
+            else
+            {
+                LOGD("auth error!");
+                return -1;
+            }
+        } else {
+            *auth = ql_apn_info[profile_idx].auth;
+        }
+
+        return 0;
+    }
+}
+
+