Fix mbtk from v1265 GSW
Change-Id: I5d8d395616f284bc74c8b9448cfa347164b5a668
diff --git a/mbtk/liblynq_lib/lynq_data_call.c b/mbtk/liblynq_lib/lynq_data_call.c
new file mode 100755
index 0000000..44d35bf
--- /dev/null
+++ b/mbtk/liblynq_lib/lynq_data_call.c
@@ -0,0 +1,894 @@
+#include "lynq-qser-data.h"
+#include "mbtk_type.h"
+#include "mbtk_info_api.h"
+
+#include <pthread.h>
+#include <cutils/properties.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+//#include <sys/scoket.h>
+#include <netinet/in.h>
+#include <arpa/inet.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 MBTK_INFO_ERR_NO_APN 500
+
+#define QSER_APN_NUM 8
+
+#define QSER_APN_NAME_MAX_LEN 64
+#define QSER_APN_USER_MAX_LEN 32
+#define QSER_APN_PAWD_MAX_LEN 32
+#define QSER_APN_TYPE_MAX_LEN 16
+
+//default range: 0 - 7
+//AT+CGACT range: 1 - 8
+//1 default IDX, 8 IMS IDX
+#define QSER_PROFILE_IDX_MIN 1
+#define QSER_PROFILE_IDX_MAX 6
+
+/****************************DEFINE***************************************/
+
+/****************************VARIABLE***************************************/
+mbtk_info_handle_t* qser_info_handle = NULL;
+int qser_info_handle_num = 0;
+static bool inited = FALSE;
+static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
+/****************************VARIABLE***************************************/
+
+/******************************FUNC*****************************************/
+static int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_qser_apn_info_s *old_apn)
+{
+ if(new_apn == NULL || old_apn == NULL)
+ {
+ LOGE("[qser_data] qser_apn_info_param_convert apn param is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ memset(new_apn, 0x0, sizeof(qser_apn_info_s));
+ new_apn->profile_idx = old_apn->cid - 1;
+ //get ip type
+ if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
+ {
+ new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
+ }
+ else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
+ {
+ new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
+ }
+ else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
+ {
+ new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
+ }
+ else
+ {
+ new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
+ }
+
+ //get apn name
+ if(strlen((char *)old_apn->apn_name) > QSER_APN_NAME_SIZE)
+ {
+ LOGE("[qser_data] apn_nmea length verylong.");
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ if(strlen((char *)old_apn->apn_name) > 0)
+ {
+ memcpy(new_apn->apn_name, old_apn->apn_name,strlen((char *)old_apn->apn_name));
+ }
+ }
+
+ //get apn user
+ if(strlen((char *)old_apn->user_name) > QSER_APN_USERNAME_SIZE)
+ {
+ LOGE("[qser_data] apn_user length verylong.");
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ if(strlen((char *)old_apn->user_name) > 0)
+ {
+ memcpy(new_apn->username, old_apn->user_name, strlen((char *)old_apn->user_name));
+ }
+ }
+
+ //get apn password
+ if(strlen((char *)old_apn->user_pass) > QSER_APN_PASSWORD_SIZE)
+ {
+ LOGE("[qser_data] apn_password length verylong.");
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ if(strlen((char *)old_apn->user_pass) > 0)
+ {
+ memcpy(new_apn->password, old_apn->user_pass, strlen((char *)old_apn->user_pass));
+ }
+ }
+
+ //get apn proto
+ new_apn->auth_proto = (qser_apn_auth_proto_e)old_apn->auth_proto;
+
+ //get apn type
+ if(strlen((char *)old_apn->apn_type) > QSER_APN_PASSWORD_SIZE)
+ {
+ LOGE("[qser_data] apn_type length verylong.");
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ if(strlen((char *)old_apn->apn_type) > 0)
+ {
+ memcpy(new_apn->apn_type, old_apn->apn_type, strlen((char *)old_apn->apn_type));
+ }
+ }
+
+ return QSER_RESULT_SUCCESS;
+}
+
+static void qser_state_init(qser_data_call_state_s *state)
+{
+ if(state != NULL)
+ {
+ state->profile_idx = 0;
+ memset(state->name, 0x0, 16);
+ state->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
+ state->state = QSER_DATA_CALL_DISCONNECTED;
+ state->err = QSER_DATA_CALL_ERROR_NONE;
+ inet_aton("0.0.0.0", &(state->v4.ip));
+ inet_aton("0.0.0.0", &(state->v4.gateway));
+ inet_aton("0.0.0.0", &(state->v4.pri_dns));
+ inet_aton("0.0.0.0", &(state->v4.sec_dns));
+ inet_pton(AF_INET6, "::", &(state->v6.ip));
+ inet_pton(AF_INET6, "::", &(state->v6.gateway));
+ inet_pton(AF_INET6, "::", &(state->v6.pri_dns));
+ inet_pton(AF_INET6, "::", &(state->v6.sec_dns));
+ }
+}
+
+void qser_wan_net_state_change_cb(const void* data, int data_len)
+{
+ if(data == NULL || data_len == 0)
+ {
+ return;
+ }
+
+ uint8 *net_data = NULL;
+ net_data = (uint8 *)data;
+
+ if(*net_data > 100 && *net_data < 200)
+ {
+ int idx = *net_data - 101;
+ if(idx <= QSER_PROFILE_IDX_MAX)
+ {
+ qser_data_call_state_s state = {0};
+ qser_state_init(&state);
+ state.profile_idx = idx;
+ state.state = QSER_DATA_CALL_DISCONNECTED;
+ if(qser_net_status_cb != NULL)
+ {
+ qser_net_status_cb(&state);
+ }
+ }
+ else
+ {
+ LOGE("[qser_data] cb fail,idx is %d.", idx);
+ }
+
+ }
+ else if(*net_data > 200 && *net_data < 220)
+ {
+ LOGE("[qser_data] cid[%d] is open.", *net_data - 201);
+ }
+ else if(*net_data > 220)
+ {
+ LOGE("[qser_data] cid[%d] is reopen.", *net_data - 221);
+ int idx = *net_data - 221;
+ if(idx <= QSER_PROFILE_IDX_MAX)
+ {
+ qser_data_call_state_s state = {0};
+ qser_state_init(&state);
+ state.profile_idx = idx;
+ state.state = QSER_DATA_CALL_CONNECTED;
+ snprintf(state.name, 16, "ccinet%d", idx);
+ if(qser_net_status_cb != NULL)
+ {
+ qser_net_status_cb(&state);
+ }
+ }
+ }
+ else if(*net_data == 1)
+ {
+ LOGE("[qser_data] pdp is open.");
+ }
+ else
+ {
+ LOGE("[qser_data] unkonwn param [%d].", *net_data);
+ }
+}
+
+static void* data_call_async_thread(void* arg)
+{
+ LOGE("[qser_data] entry data_call_async_thread.");
+ qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;
+
+ qser_data_call_s qser_data_backup = {0};
+ qser_data_call_info_s info = {0};
+ if(arg != NULL)
+ {
+ memcpy(&qser_data_backup, (qser_data_call_s *)arg, sizeof(qser_data_call_s));
+ }
+ else
+ {
+ LOGE("[qser_data] arg is NULL.");
+ }
+
+ qser_data_call_state_s state = {0};
+ qser_state_init(&state);
+ state.profile_idx = qser_data_backup.profile_idx;
+ snprintf(state.name, 16, "ccinet%d", qser_data_backup.profile_idx);
+ state.ip_family = qser_data_backup.ip_family;
+
+ int ret = qser_data_call_start(&qser_data_backup, &err);
+ if(ret != QSER_RESULT_SUCCESS)
+ {
+ LOGE("[qser_data] qser_data_call_start() fail.");
+ state.err = err;
+ }
+ else
+ {
+ state.state = QSER_DATA_CALL_CONNECTED;
+ ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
+ if(ret != QSER_RESULT_SUCCESS)
+ {
+ LOGE("[qser_data] qser_data_call_info_get() fail.");
+ state.err = err;
+ }
+ else
+ {
+ memcpy(&(state.v4), &(info.v4.addr), sizeof(struct v4_address_status));
+ memcpy(&(state.v6), &(info.v6.addr), sizeof(struct v6_address_status));
+ }
+ }
+
+ if(qser_net_status_cb != NULL)
+ {
+ qser_net_status_cb(&state);
+ }
+ return NULL;
+}
+
+/******************************FUNC*****************************************/
+
+/****************************API***************************************/
+int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
+{
+ //UNUSED(evt_cb);
+ if(!inited && qser_info_handle == NULL)
+ {
+ qser_info_handle = mbtk_info_handle_get();
+ if(qser_info_handle)
+ {
+ qser_info_handle_num++;
+ inited = TRUE;
+ mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
+ }
+ else
+ {
+ LOGE("[qser_data] mbtk_info_handle_get() fail.");
+ return QSER_RESULT_FAIL;
+ }
+ }
+ else
+ {
+ if(!inited)
+ {
+ qser_info_handle_num++;
+ inited = TRUE;
+ mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
+ }
+ }
+ qser_net_status_cb = evt_cb;
+
+ LOGE("[qser_data] mbtk_info_handle_get() success.");
+ return QSER_RESULT_SUCCESS;
+}
+
+void qser_data_call_destroy(void)
+{
+ if(qser_info_handle)
+ {
+ LOGE("[qser_data] qser_info_handle_num = %d", qser_info_handle_num);
+ if(qser_info_handle_num == 1)
+ { // 最后一个引用,可释放。
+ int ret = mbtk_info_handle_free(&qser_info_handle);
+ if(ret)
+ {
+ LOGE("[qser_data] mbtk_info_handle_free() fail.");
+ }
+ else
+ {
+ qser_info_handle_num = 0;
+ qser_info_handle = NULL;
+ qser_net_status_cb = NULL;
+ inited = FALSE;
+ }
+ }
+ else
+ {
+ qser_info_handle_num--;
+ qser_net_status_cb = NULL;
+ }
+ }
+ else
+ {
+ LOGE("[qser_data] handle not inited.");
+ }
+}
+
+int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
+{
+ //UNUSED(data_call);
+ //UNUSED(err);
+ if(data_call == NULL || err == NULL)
+ {
+ LOGE("[qser_data] data_call or err is NULL.");
+ if(err != NULL)
+ {
+ *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+ }
+ return QSER_RESULT_FAIL;
+ }
+
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ *err = QSER_DATA_CALL_ERROR_NO_INIT;
+ return QSER_RESULT_FAIL;
+ }
+
+ int ret = -1;
+ ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
+ if(ret != 0)
+ {
+ LOGE("[qser_data] mbtk_data_call_start fail.[ret = %d]", ret);
+ 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
+ {
+ *err = QSER_DATA_CALL_ERROR_NONE;
+ }
+
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
+{
+ //UNUSED(data_call);
+ UNUSED(err);
+ if(data_call == NULL || err == NULL)
+ {
+ LOGE("[qser_data] data_call or err is NULL.");
+ if(err != NULL)
+ {
+ *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+ }
+ return QSER_RESULT_FAIL;
+ }
+
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ *err = QSER_DATA_CALL_ERROR_NO_INIT;
+ return QSER_RESULT_FAIL;
+ }
+
+ pthread_attr_t thread_attr;
+ pthread_t data_call_thread_id;
+ pthread_attr_init(&thread_attr);
+ if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+ {
+ LOGE("[qser_data] pthread_attr_setdetachstate() fail.");
+ *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+ return QSER_RESULT_FAIL;
+ }
+
+ //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
+ if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
+ {
+ LOGE("[qser_data] pthread_create() fail.");
+ *err = QSER_DATA_CALL_ERROR_UNKNOWN;
+ return QSER_RESULT_FAIL;
+ }
+ pthread_attr_destroy(&thread_attr);
+
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
+{
+ //UNUSED(profile_idx);
+ UNUSED(ip_family);
+ //UNUSED(err);
+ if(err == NULL)
+ {
+ LOGE("[qser_data] err is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ *err = QSER_DATA_CALL_ERROR_NO_INIT;
+ return QSER_RESULT_FAIL;
+ }
+
+ int ret = -1;
+ ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
+ if(ret != 0)
+ {
+ LOGE("[qser_data] mbtk_data_call_stop fail.[ret = %d]", ret);
+ 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
+ {
+ *err = QSER_DATA_CALL_ERROR_NONE;
+ }
+
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
+ qser_data_call_info_s *info, qser_data_call_error_e *err)
+{
+ //UNUSED(profile_idx);
+ UNUSED(ip_family);
+ //UNUSED(info);
+ //UNUSED(err);
+
+ if(info == NULL || err == NULL)
+ {
+ LOGE("[qser_data] info or err is NULL.");
+ if(err != NULL)
+ {
+ *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
+ }
+ return QSER_RESULT_FAIL;
+ }
+
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ *err = QSER_DATA_CALL_ERROR_NO_INIT;
+ return QSER_RESULT_FAIL;
+ }
+
+ int ret = -1;
+ mbtk_ipv4_info_t ipv4;
+ mbtk_ipv6_info_t ipv6;
+#ifdef QSER_TEST
+ char v4_buff[32] = {0};
+ char v6_buff[128] = {0};
+#endif
+ memset(info, 0, sizeof(qser_data_call_info_s));
+ ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
+ if(ret != 0)
+ {
+ LOGE("[qser_data] mbtk_data_call_state_get fail.[ret = %d]", ret);
+ 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
+ {
+ info->profile_idx = profile_idx;
+ if(ipv4.valid)
+ {
+ info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
+ info->v4.state = QSER_DATA_CALL_CONNECTED;
+ sprintf(info->v4.name, "ccinet%d", profile_idx);
+ 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;
+ info->v4.reconnect = 1;
+
+#ifdef QSER_TEST
+ //LOGE("[qser_data] 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] IP error.");
+ } else {
+ LOGE("[qser_data] IP : %s", v4_buff);
+ }
+ if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
+ LOGE("[qser_data] PrimaryDNS error.");
+ } else {
+ LOGE("[qser_data] PrimaryDNS : %s", v4_buff);
+ }
+ if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
+ LOGE("[qser_data] SecondaryDNS error.");
+ } else {
+ LOGE("[qser_data] SecondaryDNS : %s", v4_buff);
+ }
+#endif
+ }
+
+ if(ipv6.valid)
+ {
+ 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), 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));
+ info->v6.reconnect = 1;
+
+#ifdef QSER_TEST
+ if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
+ {
+ LOGE("[qser_data] IP error.");
+ } else {
+ LOGE("[qser_data] IP : %s", v6_buff);
+ }
+ if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
+ {
+ LOGE("[qser_data] PrimaryDNS error.");
+ } else {
+ LOGE("[qser_data] PrimaryDNS : %s", v6_buff);
+ }
+ if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
+ {
+ LOGE("[qser_data] SecondaryDNS error.");
+ } else {
+ LOGE("[qser_data] SecondaryDNS : %s", v6_buff);
+ }
+#endif
+ }
+
+ if(ipv4.valid && ipv6.valid)
+ {
+ info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
+ }
+
+ if(!ipv4.valid && !ipv6.valid)
+ {
+ info->v4.state = QSER_DATA_CALL_DISCONNECTED;
+ info->v6.state = QSER_DATA_CALL_DISCONNECTED;
+ }
+ }
+
+ *err = QSER_DATA_CALL_ERROR_NONE;
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_set(qser_apn_info_s *apn)
+{
+ //UNUSED(apn);
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(apn == NULL)
+ {
+ LOGE("[qser_data] apn param is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(strlen(apn->apn_name) > QSER_APN_NAME_MAX_LEN || strlen(apn->username) > QSER_APN_USER_MAX_LEN
+ || strlen(apn->password) > QSER_APN_PAWD_MAX_LEN || strlen(apn->apn_type) > QSER_APN_TYPE_MAX_LEN)
+ {
+ LOGE("[qser_data] apn length out of range.");
+ return QSER_RESULT_FAIL;
+ }
+
+ int ret = 0;
+ mbtk_qser_apn_info_s apninfo;
+ memset(&apninfo, 0x0, sizeof(mbtk_qser_apn_info_s));
+ apninfo.cid = apn->profile_idx + 1;
+
+ if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_IP;
+ }
+ else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_IPV6;
+ }
+ else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_IPV4V6;
+ }
+ else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_PPP;
+ }
+ else
+ {
+ LOGE("[qser_data] pdp_type error.");
+ return QSER_RESULT_FAIL;
+ }
+
+
+ apninfo.req_type = MBTK_APN_REQ_TYPE_SET;
+ apninfo.auth_proto = (mbtk_apn_auth_proto_enum)apn->auth_proto;
+ if(strlen(apn->apn_name))
+ {
+ memcpy(apninfo.apn_name, apn->apn_name, strlen(apn->apn_name));
+ }
+ else
+ {
+ LOGE("[qser_data] apn_name is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+ if(strlen(apn->username))
+ {
+ memcpy(apninfo.user_name, apn->username, strlen(apn->username));
+ }
+ if(strlen(apn->password))
+ {
+ memcpy(apninfo.user_pass, apn->password, strlen(apn->password));
+ }
+ if(strlen(apn->apn_type))
+ {
+ memcpy(apninfo.apn_type, apn->apn_type, strlen(apn->apn_type));
+ }
+ ret = mbtk_qser_apn_set(qser_info_handle, &apninfo, NULL);
+ if(ret != 0)
+ {
+ LOGE("[qser_data] mbtk_qser_apn_set fail.");
+ return QSER_RESULT_FAIL;
+ }
+
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
+{
+ //UNUSED(profile_idx);
+ //UNUSED(apn);
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(apn == NULL)
+ {
+ LOGE("[qser_data] apn param is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ //get apn info
+ mbtk_qser_apn_info_s apns[10] = {0};
+ int apn_num = 10;
+ int ret = mbtk_qser_apn_get(qser_info_handle, &apn_num, apns);
+ if(ret != 0)
+ {
+ LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ int i = 0;
+ for(i = 0; i < apn_num; i++)
+ {
+ if(apns[i].cid == profile_idx + 1)
+ {
+ LOGE("[qser_data] find IDX.");
+ break;
+ }
+ }
+
+ if(i == apn_num)
+ {
+ LOGE("[qser_data] not find IDX.[apn_num = %d]", apn_num);
+ return QSER_RESULT_FAIL;
+ }
+
+ if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
+ {
+ LOGE("[qser_data] qser_apn_info_param_convert fail");
+ return QSER_RESULT_FAIL;
+ }
+ }
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
+{
+ //UNUSED(apn);
+ //UNUSED(profile_idx);
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(apn == NULL || profile_idx == NULL)
+ {
+ LOGE("[qser_data] apn param is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(strlen(apn->apn_name) > QSER_APN_NAME_MAX_LEN || strlen(apn->username) > QSER_APN_USER_MAX_LEN
+ || strlen(apn->password) > QSER_APN_PAWD_MAX_LEN || strlen(apn->apn_type) > QSER_APN_TYPE_MAX_LEN)
+ {
+ LOGE("[qser_data] apn length out of range.");
+ return QSER_RESULT_FAIL;
+ }
+
+ int ret = 0;
+ unsigned char idx[2] = {0};
+ mbtk_qser_apn_info_s apninfo;
+ memset(&apninfo, 0x0, sizeof(mbtk_qser_apn_info_s));
+ apninfo.cid = 0;
+
+ if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_IP;
+ }
+ else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_IPV6;
+ }
+ else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_IPV4V6;
+ }
+ else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
+ {
+ apninfo.ip_type = MBTK_IP_TYPE_PPP;
+ }
+ else
+ {
+ LOGE("[qser_data] pdp_type error.");
+ return QSER_RESULT_FAIL;
+ }
+
+ apninfo.req_type = MBTK_APN_REQ_TYPE_ADD;
+ apninfo.auth_proto = (mbtk_apn_auth_proto_enum)apn->auth_proto;
+ if(strlen(apn->apn_name))
+ {
+ memcpy(apninfo.apn_name, apn->apn_name, strlen(apn->apn_name));
+ }
+
+ if(strlen(apn->username))
+ {
+ memcpy(apninfo.user_name, apn->username, strlen(apn->username));
+ }
+ if(strlen(apn->password))
+ {
+ memcpy(apninfo.user_pass, apn->password, strlen(apn->password));
+ }
+ if(strlen(apn->apn_type))
+ {
+ memcpy(apninfo.apn_type, apn->apn_type, strlen(apn->apn_type));
+ }
+ ret = mbtk_qser_apn_set(qser_info_handle, &apninfo, idx);
+ if(ret != 0)
+ {
+ LOGE("[qser_data] mbtk_qser_apn_set fail.");
+ return QSER_RESULT_FAIL;
+ }
+ *profile_idx = idx[0] - 1;
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_del(unsigned char profile_idx)
+{
+ int ret = 0;
+ qser_apn_info_s qser_apn = {0};
+
+ //UNUSED(profile_idx);
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ ret = qser_apn_get(profile_idx, &qser_apn);
+ if (ret < 0)
+ {
+ LOGE("[qser_data] mbtk_apn_del idx no find!");
+ return QSER_RESULT_FAIL;
+ }
+
+ ret = mbtk_apn_del(qser_info_handle, profile_idx);
+ if(ret < 0)
+ {
+ LOGE("[qser_data] mbtk_apn_del fail!");
+ return QSER_RESULT_FAIL;
+ }
+ return QSER_RESULT_SUCCESS;
+}
+
+int qser_apn_get_list(qser_apn_info_list_s *apn_list)
+{
+ //UNUSED(apn_list);
+
+ if(qser_info_handle == NULL)
+ {
+ LOGE("[qser_data] handle is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ if(apn_list == NULL)
+ {
+ LOGE("[qser_data] apn_list param is NULL.");
+ return QSER_RESULT_FAIL;
+ }
+
+ mbtk_qser_apn_info_s apns[10] = {0};
+ int apn_num = 10;
+ int ret = mbtk_qser_apn_get(qser_info_handle, &apn_num, apns);
+ if(ret != 0)
+ {
+ if(ret == MBTK_INFO_ERR_NO_APN)
+ {
+ apn_list->cnt = 0;
+ return QSER_RESULT_SUCCESS;
+ }
+ LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
+ {
+ int i = 0;
+ apn_list->cnt = 0;
+ for(i = 0; i < apn_num; i++)
+ {
+ if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[apn_list->cnt], &apns[i]) != 0)
+ {
+ LOGE("[qser_data] qser_apn_info_param_convert fail");
+ return QSER_RESULT_FAIL;
+ }
+ apn_list->cnt++;
+ }
+ }
+ else if(apn_num > QSER_APN_MAX_LIST)
+ {
+ LOGE("[qser_data] apn_num overlong");
+ return QSER_RESULT_FAIL;
+ }
+ else
+ {
+ apn_list->cnt = 0;
+ }
+ }
+ return QSER_RESULT_SUCCESS;
+}
+/****************************API***************************************/
+