Add master branch change.

Change-Id: I8892b7102753d29fefb4e23a7a7cc67c01157560
diff --git a/mbtk/liblynq_lib/src/lynq_data_call.c b/mbtk/liblynq_lib/src/lynq_data_call.c
index 88f2074..095b41a 100755
--- a/mbtk/liblynq_lib/src/lynq_data_call.c
+++ b/mbtk/liblynq_lib/src/lynq_data_call.c
@@ -5,15 +5,23 @@
 #include <pthread.h>
 #include <cutils/properties.h>
 #include <string.h>
+#include <fcntl.h>
 /****************************DEFINE***************************************/
 #define QSER_RESULT_SUCCESS 0
 #define QSER_RESULT_FAIL -1
 
+#define MBTK_INFO_ERR_CID_EXIST 311
+#define MBTK_INFO_ERR_CID_NO_EXIST 312
+
 #define QSER_APN_NUM 8
 //default  range: 0 - 7
 //AT+CGACT range: 1 - 8
 //1 default IDX, 8 IMS IDX
+#if defined(MBTK_ALL_CID_SUPPORT)
+#define QSER_PROFILE_IDX_MIN 0
+#else
 #define QSER_PROFILE_IDX_MIN 1
+#endif
 #define QSER_PROFILE_IDX_MAX 6
 
 /****************************DEFINE***************************************/
@@ -27,10 +35,94 @@
 static bool qser_apn_info_state[QSER_APN_NUM] = {0};
 static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
 static qser_data_call_s qser_data_backup;
+#if defined(MBTK_ALL_CID_SUPPORT)
+static int qser_apn_default_idx = -1;
+#else
+static int qser_apn_default_idx = 0xFF;
+#endif
 int now_idx = 0;
 /****************************VARIABLE***************************************/
 
 /******************************FUNC*****************************************/
+#if defined(MBTK_ALL_CID_SUPPORT)
+int qser_route_config(int profile_idx)
+{
+    char buf[1024] = {0};
+    char dns[128] = {0};
+    int offset = 0;
+    int fd = -1;
+    mbtk_ipv4_info_t ipv4;
+    mbtk_ipv6_info_t ipv6;
+    sprintf(buf, "route add default dev ccinet%d", profile_idx -1);
+    system(buf);
+
+    int ret = mbtk_data_call_state_get(qser_info_handle, profile_idx, &ipv4, &ipv6);
+    if(ret != 0)
+        return -1;
+    else
+    {
+        memset(buf, 0x0, 1024);
+        memset(dns, 0x0, 128);
+        offset = sprintf(buf, "search lan\n");
+        if(ipv4.valid)
+        {
+            if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), dns, 32) == NULL) {
+                LOGD("PrimaryDNS error.");
+            } else {
+                LOGD("PrimaryDNS : %s", dns);
+            }
+            offset += sprintf(buf + offset, "nameserver %s\n", dns);
+            memset(dns, 0x0, 128);
+            if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), dns, 32) == NULL) {
+                LOGD("SecondaryDNS error.");
+            } else {
+                LOGD("SecondaryDNS : %s", dns);
+            }
+            offset += sprintf(buf + offset, "nameserver %s\n", dns);
+        }
+        if(ipv6.valid)
+        {
+            memset(dns, 0x0, 128);
+			if(ipv6_2_str(&(ipv6.PrimaryDNS), dns))
+            {
+				LOGD("PrimaryDNS error.");
+			} else {
+				LOGD("PrimaryDNS : %s", dns);
+			}
+            offset += sprintf(buf + offset, "nameserver %s\n", dns);
+            memset(dns, 0x0, 128);
+			if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
+            {
+				LOGD("SecondaryDNS error.");
+			} else {
+				LOGD("SecondaryDNS : %s", dns);
+			}
+            offset += sprintf(buf + offset, "nameserver %s\n", dns);
+        }
+
+        if(offset > 0)
+        {
+            fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
+            if(fd < 0)
+            {
+                LOGD("mbtk_route_config : open fail.");
+                return -1;
+            }
+
+            ret = write(fd, buf, offset);
+            if(ret < 0)
+            {
+                LOGD("mbtk_route_config : write fail.");
+            }
+
+            close(fd);
+        }
+    }
+
+    return 0;
+}
+#endif
+
 char qser_get_apn_profile_idx(void)
 {
     char i = 0;
@@ -276,6 +368,14 @@
                     LOGE("[qser_data_call] idx no open.");
                     continue;
                 }
+
+#if defined(MBTK_ALL_CID_SUPPORT)
+                if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
+                {
+                    qser_apn_default_idx = apns[i].cid - 1;
+                }
+#endif
+
                 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
                 {
                     LOGE("[qser_data_call] qser_apn_info_param_convert fail");
@@ -341,14 +441,14 @@
     if(qser_info_handle == NULL)
     {
         LOGE("[qser_data_call] handle is NULL.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
 
     if(qser_check_profile_idx(data_call->profile_idx) < 0)
     {
         LOGE("[qser_data_call] profile_idx is invalid.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
         return QSER_RESULT_FAIL;
     }
 
@@ -357,7 +457,14 @@
     if(ret != 0)
     {
         LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        if(ret == MBTK_INFO_ERR_CID_EXIST)
+        {
+            *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
+        }
+        else
+        {
+            *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        }
         return QSER_RESULT_FAIL;
     }
     else
@@ -366,6 +473,14 @@
     }
 
     now_idx = data_call->profile_idx;
+
+#if defined(MBTK_ALL_CID_SUPPORT)
+    if(qser_apn_default_idx == data_call->profile_idx)
+    {
+        qser_route_config(qser_apn_default_idx + 1);
+    }
+#endif
+
     return QSER_RESULT_SUCCESS;
 }
 
@@ -386,14 +501,14 @@
     if(qser_info_handle == NULL)
     {
         LOGE("[qser_data_call] handle is NULL.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
 
     if(qser_check_profile_idx(data_call->profile_idx) < 0)
     {
         LOGE("[qser_data_call] profile_idx is invalid.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
         return QSER_RESULT_FAIL;
     }
 
@@ -403,7 +518,7 @@
     if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
     {
         LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
         return QSER_RESULT_FAIL;
     }
 
@@ -411,7 +526,7 @@
     if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, NULL))
     {
         LOGE("[qser_data_call] pthread_create() fail.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
         return QSER_RESULT_FAIL;
     }
     pthread_attr_destroy(&thread_attr);
@@ -434,14 +549,14 @@
     if(qser_info_handle == NULL)
     {
         LOGE("[qser_data_call] handle is NULL.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
 
     if(qser_check_profile_idx(profile_idx) < 0)
     {
         LOGE("[qser_data_call] profile_idx is invalid.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
         return QSER_RESULT_FAIL;
     }
 
@@ -450,7 +565,14 @@
     if(ret != 0)
     {
         LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
+        {
+            *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
+        }
+        else
+        {
+            *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        }
         return QSER_RESULT_FAIL;
     }
     else
@@ -483,14 +605,14 @@
     if(qser_info_handle == NULL)
     {
         LOGE("[qser_data_call] handle is NULL.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
 
     if(qser_check_profile_idx(profile_idx) < 0)
     {
         LOGE("[qser_data_call] profile_idx is invalid.");
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
         return QSER_RESULT_FAIL;
     }
 
@@ -506,7 +628,14 @@
     if(ret != 0)
     {
         LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
-        *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+        if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
+        {
+            *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
+        }
+        else
+        {
+            *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+        }
         return QSER_RESULT_FAIL;
     }
     else
@@ -517,10 +646,12 @@
             info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
             info->v4.state = QSER_DATA_CALL_CONNECTED;
             sprintf(info->v4.name, "ccinet%d", profile_idx);
-            memcpy(&(info->v4.addr.ip), &(ipv4.IPAddr), 32);
-            memcpy(&(info->v4.addr.pri_dns), &(ipv4.PrimaryDNS), 32);
-            memcpy(&(info->v4.addr.sec_dns), &(ipv4.SecondaryDNS), 32);
+            info->v4.addr.ip.s_addr = ipv4.IPAddr;
+            info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
+            info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
+
 #ifdef QSER_TEST
+            //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
             if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
                 LOGE("[qser_data_call] IP error.");
             } else {
@@ -544,9 +675,9 @@
             info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
             info->v6.state = QSER_DATA_CALL_CONNECTED;
             sprintf(info->v6.name, "ccinet%d", profile_idx);
-            memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), 128);
-            memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), 128);
-            memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), 128);
+            memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
+            memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
+            memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
 #ifdef QSER_TEST
 			if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
             {
@@ -612,11 +743,13 @@
         return QSER_RESULT_FAIL;
     }
 
+#if 0
     if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
     {
         LOGE("[qser_data_call] iot_default is exist.");
         return QSER_RESULT_FAIL;
     }
+#endif
 
     int ret = -1;
     char mbtk_auth[32]={0};
@@ -765,6 +898,15 @@
         return QSER_RESULT_FAIL;
     }
 
+    if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
+    {
+        if(qser_apn_default_idx > -1)
+        {
+            LOGE("[qser_data_call] iot_default is exist.");
+            return QSER_RESULT_FAIL;
+        }
+    }
+
     int ret = 0;
     char idx = qser_get_apn_profile_idx();
     if(idx >= 8)
@@ -791,7 +933,18 @@
             return QSER_RESULT_FAIL;
         }
         *profile_idx = idx;
-        qser_apn_add_save_state[idx] = '1';
+#if defined(MBTK_ALL_CID_SUPPORT)
+        if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
+        {
+            qser_apn_add_save_state[idx] = '2';
+            qser_apn_default_idx = idx;
+        }
+        else
+#endif
+        {
+            qser_apn_add_save_state[idx] = '1';
+        }
+        
         property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
     }
     return QSER_RESULT_SUCCESS;
@@ -814,6 +967,14 @@
 
     qser_apn_info_state[profile_idx] = FALSE;
     qser_apn_add_save_state[profile_idx] = '0';
+    
+#if defined(MBTK_ALL_CID_SUPPORT)
+    if(profile_idx == qser_apn_default_idx)
+    {
+        qser_apn_default_idx = -1;
+    }
+#endif
+    
     property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
     return QSER_RESULT_SUCCESS;
 }
diff --git a/mbtk/liblynq_lib/src/lynq_log.c b/mbtk/liblynq_lib/src/lynq_log.c
index 6e3885a..65ffc31 100755
--- a/mbtk/liblynq_lib/src/lynq_log.c
+++ b/mbtk/liblynq_lib/src/lynq_log.c
@@ -1,5 +1,6 @@
+#include <stdarg.h>
 #include "json/json.h"
-#include "liblog.h"
+#include "lynq_deflog.h"
 #include "mbtk_type.h"
 
 #define LOG_CONFIG_PATH     "/etc/mbtk/mbtk_log.json"
@@ -15,9 +16,15 @@
 
 void lynq_log_global_output(log_level_enum Level,const char *format,...)
 {
-    UNUSED(Level);
-    UNUSED(format);
+    va_list args;
+    va_start(args,format);
+    mbtk_log(Level, format, args);
+    va_end(args);
+}
 
+const char* lynq_read_log_version()
+{
+    return "LOG-V1.0";
 }
 
 int lynq_syslog_set_file_size(int value)