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)