T108: fix data_call

Change-Id: I48ac56b38bd7bbfaad8c310398bc3a1e7e2613d1
diff --git a/mbtk/liblynq_lib/src/lynq_data_call.c b/mbtk/liblynq_lib/src/lynq_data_call.c
index ee9e754..3d3cdda 100644
--- a/mbtk/liblynq_lib/src/lynq_data_call.c
+++ b/mbtk/liblynq_lib/src/lynq_data_call.c
@@ -39,139 +39,19 @@
 int qser_info_handle_num = 0;
 static bool inited = FALSE;
 static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
-static qser_apn_info_s qser_apn_info[QSER_APN_NUM] = {0};
-static bool qser_apn_info_state[QSER_APN_NUM] = {0};
-static bool qser_idx_pdp_state[QSER_APN_NUM];
-static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
-static char qser_apn_auth_state[QSER_APN_NUM + 1] = {0};
-#if defined(MBTK_ALL_CID_SUPPORT)
-static int qser_apn_default_idx = -1;
-static int qser_default_pdp_idx = -1;
-#else
-static int qser_apn_default_idx = 0xFF;
-static int qser_default_pdp_idx = 0;
-#endif
 /****************************VARIABLE***************************************/
 
 /******************************FUNC*****************************************/
-#if defined(MBTK_ALL_CID_SUPPORT)
-static 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 QSER_RESULT_FAIL;
-    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) {
-                LOGE("[qser_data] PrimaryDNS error.");
-            } else {
-                LOGE("[qser_data] 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) {
-                LOGE("[qser_data] SecondaryDNS error.");
-            } else {
-                LOGE("[qser_data] 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))
-            {
-				LOGE("[qser_data] PrimaryDNS error.");
-			} else {
-				LOGE("[qser_data] PrimaryDNS : %s", dns);
-			}
-            offset += sprintf(buf + offset, "nameserver %s\n", dns);
-            memset(dns, 0x0, 128);
-			if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
-            {
-				LOGE("[qser_data] SecondaryDNS error.");
-			} else {
-				LOGE("[qser_data] 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)
-            {
-                LOGE("[qser_data] mbtk_route_config : open fail.");
-                return QSER_RESULT_FAIL;
-            }
-
-            ret = write(fd, buf, offset);
-            if(ret < 0)
-            {
-                LOGE("[qser_data] mbtk_route_config : write fail.");
-            }
-
-            close(fd);
-        }
-    }
-
-    return 0;
-}
-#endif
-
-static char qser_get_apn_profile_idx(void)
-{
-    char i = 0;
-    for(i = QSER_PROFILE_IDX_MIN; i <= QSER_PROFILE_IDX_MAX; i++)
-    {
-        if(qser_apn_info_state[i] == FALSE)
-        {
-            return i;
-        }
-    }
-
-    return i;
-}
-
-static int qser_check_profile_idx(unsigned char profile_idx)
-{
-    if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
-    {
-        LOGE("[qser_data] IDX range error.");
-        return QSER_RESULT_FAIL;
-    }
-    
-    if(qser_apn_info_state[profile_idx] != TRUE)
-    {
-        LOGE("[qser_data] profile_idx is not exist.");
-        return QSER_RESULT_FAIL;
-    }
-
-    return QSER_RESULT_SUCCESS;
-}
-
-static int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
+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
     {
@@ -191,181 +71,61 @@
     }
 
     //get apn name
-    if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
+    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(old_apn->apn) > 0)
+        if(strlen((char *)old_apn->apn_name) > 0)
         {
-            memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
-        }
-        else
-        {
-            memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
+            memcpy(new_apn->apn_name, old_apn->apn_name,strlen((char *)old_apn->apn_name));
         }
     }
 
     //get apn user
-    if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
+    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(old_apn->user) > 0)
+        if(strlen((char *)old_apn->user_name) > 0)
         {
-            memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
-        }
-        else
-        {
-            memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
+            memcpy(new_apn->username, old_apn->user_name, strlen((char *)old_apn->user_name));
         }
     }
 
     //get apn password
-    if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
+    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(old_apn->pass) > 0)
+        if(strlen((char *)old_apn->user_pass) > 0)
         {
-            memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
-        }
-        else
-        {
-            memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
+            memcpy(new_apn->password, old_apn->user_pass, strlen((char *)old_apn->user_pass));
         }
     }
 
     //get apn proto
-    if(strlen(old_apn->auth) > 0)
-    {
-        if(strcmp(old_apn->auth, "NONE") == 0)
-        {
-            if(qser_apn_auth_state[profile_idx] == '1')
-            {
-                new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
-            }
-            else
-            {
-                new_apn->auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;
-            }
-        }
-        else if(strcmp(old_apn->auth, "PAP") == 0)
-        {
-            new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
-        }
-        else if(strcmp(old_apn->auth, "CHAP") == 0)
-        {
-            new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
-        }
-        else
-        {
-            LOGE("[qser_data] auth input error!");
-            return QSER_RESULT_FAIL;
-        }
-    }
+    new_apn->auth_proto = (qser_apn_auth_proto_e)old_apn->auth_proto;
 
     //get apn type
-    new_apn->profile_idx = profile_idx;
-    memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
-    if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
+    if(strlen((char *)old_apn->apn_type) > QSER_APN_PASSWORD_SIZE)
     {
-        memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
-    }
-
-    return QSER_RESULT_SUCCESS;
-}
-
-/*Check parameter*/
-static int qser_check_apn_name_type(qser_apn_info_s *apn)
-{
-    if(apn == NULL)
-    {
-        LOGE("[qser_data] qser_check_apn_type apn is NULL!");
+        LOGE("[qser_data] apn_type length verylong.");
         return QSER_RESULT_FAIL;
     }
-
-    //check default idx = 0
-    int apn_name_length = strlen(apn->apn_name);
-    //LOGE("[qser_data] qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
-    char *p = strstr(qser_apn_info[0].apn_name, "mnc");
-    if(p == NULL)
-    {
-        LOGE("[qser_data] qser_check_apn_type not find!");
-        //return QSER_RESULT_FAIL;
-    }
     else
     {
-        int default_apn_name_length = p - (qser_apn_info[0].apn_name) -1;
-        LOGE("[qser_data] qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
-        if(default_apn_name_length == apn_name_length)
+        if(strlen((char *)old_apn->apn_type) > 0)
         {
-            int i = 0;
-            while(i < default_apn_name_length)
-            {
-                if(isalpha(qser_apn_info[0].apn_name[i]) && isalpha(apn->apn_name[i]))
-                {
-                    if(tolower(qser_apn_info[0].apn_name[i]) != tolower(apn->apn_name[i]))
-                    {
-                        break;
-                    }
-                }
-                else
-                {
-                    //LOGE("[qser_data] not char!");
-                    if(qser_apn_info[0].apn_name[i] != apn->apn_name[i])
-                    {
-                        break;
-                    }
-                }
-                
-                i++;
-            }
-
-            if(i == default_apn_name_length)
-            {
-                LOGE("[qser_data] apn_name is same!idx = [0]");
-                return QSER_RESULT_FAIL;
-            }
-        }
-    }
-    //check 1 -6
-    int pdp_type_tmp = 1;
-    for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
-    {
-        if(pdp_type_tmp == apn->profile_idx)
-        {
-            continue;
-        }
-        if( (qser_apn_add_save_state[pdp_type_tmp] == '1') || (qser_apn_add_save_state[pdp_type_tmp] == '2') )
-        {
-            if(strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
-            {
-                LOGE("[qser_data] apn_type is same!idx = [%d]", pdp_type_tmp);
-                return QSER_RESULT_FAIL;
-            }
-            if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0)
-            {
-                if(qser_apn_info[pdp_type_tmp].pdp_type == QSER_APN_PDP_TYPE_IPV4V6 || apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
-                {
-                    LOGE("[qser_data] apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
-                    return QSER_RESULT_FAIL;
-                }
-
-                if(qser_apn_info[pdp_type_tmp].pdp_type == apn->pdp_type)
-                {
-                    LOGE("[qser_data] pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
-                    return QSER_RESULT_FAIL;
-                }
-            }
+            memcpy(new_apn->apn_type, old_apn->apn_type, strlen((char *)old_apn->apn_type));
         }
     }
 
@@ -411,12 +171,6 @@
             qser_state_init(&state);
             state.profile_idx = idx;
             state.state = QSER_DATA_CALL_DISCONNECTED;
-            if( idx == qser_default_pdp_idx )
-            {
-                qser_default_pdp_idx = -1;
-            }
-            qser_idx_pdp_state[idx] = false;
-
             if(qser_net_status_cb != NULL)
             {
                 qser_net_status_cb(&state);
@@ -528,69 +282,6 @@
     }
     qser_net_status_cb = evt_cb;
 
-    property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
-    LOGE("[qser_data] qser_apn_add_save_state = %s", qser_apn_add_save_state);
-    property_get("persist.qser.apn.auth", qser_apn_auth_state, "00000000");
-    mbtk_apn_info_t apns[10] = {0};
-    int apn_num = 10;
-    char qser_apn_type[32] = {0};
-    int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
-    if(ret != 0)
-    {
-        if(ret == MBTK_INFO_ERR_NO_APN)
-        {
-            return QSER_RESULT_SUCCESS;
-        }
-        LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
-        qser_data_call_destroy();
-        return QSER_RESULT_FAIL;
-    }
-    else
-    {
-        if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
-        {
-            int i = 0;
-            for(i = 0; i < apn_num; i++)
-            {
-                if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
-                {
-                    //LOGE("[qser_data] idx no open.");
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-                    if(apns[i].cid - 1 == 0)
-                    {
-                        qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]);
-                    }
-#endif
-                    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] qser_apn_info_param_convert fail");
-                    return QSER_RESULT_FAIL;
-                }
-                else
-                {
-                    qser_apn_info_state[apns[i].cid - 1] = TRUE;
-                    sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
-                    property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
-                }
-            }
-        }
-    }
-
-    int idx = 0;
-    for(;idx < QSER_APN_NUM; idx++)
-    {
-        qser_idx_pdp_state[idx] = false;
-    }
     LOGE("[qser_data] mbtk_info_handle_get() success.");
     return QSER_RESULT_SUCCESS;
 }
@@ -648,31 +339,6 @@
         return QSER_RESULT_FAIL;
     }
 
-#if defined(MBTK_ALL_CID_SUPPORT)
-    if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
-    {
-        LOGE("[qser_data] default pdp exist.");
-        *err = QSER_DATA_CALL_ERROR_UNKNOWN;
-        return QSER_RESULT_FAIL;
-    }
-#endif
-
-    if(qser_check_profile_idx(data_call->profile_idx) < 0)
-    {
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-        if( data_call->profile_idx == 0 )
-        {
-            LOGE("[qser_data] profile_idx = 0.");
-        }
-        else
-#endif
-        {
-            LOGE("[qser_data] profile_idx is invalid.");
-            *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
-            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)
@@ -693,25 +359,6 @@
         *err = QSER_DATA_CALL_ERROR_NONE;
     }
 
-#if defined(MBTK_ALL_CID_SUPPORT)
-    if(qser_apn_default_idx == data_call->profile_idx)
-    {
-        qser_route_config(qser_apn_default_idx + 1);
-        qser_default_pdp_idx = data_call->profile_idx;
-    }
-    else if(data_call->profile_idx == 0)
-    {
-        qser_route_config(1);
-        qser_default_pdp_idx = data_call->profile_idx;
-    }
-    else
-    {
-        //
-    }
-        
-#endif
-    qser_idx_pdp_state[data_call->profile_idx] = true;
-
     return QSER_RESULT_SUCCESS;
 }
 
@@ -736,32 +383,6 @@
         return QSER_RESULT_FAIL;
     }
 
-#if defined(MBTK_ALL_CID_SUPPORT)
-        if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
-        {
-            LOGE("[qser_data] default pdp exist.");
-            *err = QSER_DATA_CALL_ERROR_UNKNOWN;
-            return QSER_RESULT_FAIL;
-        }
-#endif
-
-    if(qser_check_profile_idx(data_call->profile_idx) < 0)
-    {
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-        if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
-        {
-            LOGE("[qser_data] profile_idx = 0 and not open default idx.");
-        }
-        else
-#endif
-        {
-            LOGE("[qser_data] profile_idx is invalid.");
-            *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
-            return QSER_RESULT_FAIL;
-        }
-
-    }
-
     pthread_attr_t thread_attr;
     pthread_t data_call_thread_id;
     pthread_attr_init(&thread_attr);
@@ -802,22 +423,6 @@
         return QSER_RESULT_FAIL;
     }
 
-    if(qser_check_profile_idx(profile_idx) < 0)
-    {
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-        if(profile_idx == 0)
-        {
-            LOGE("[qser_data] profile_idx = 0.");
-        }
-        else
-#endif
-        {
-            LOGE("[qser_data] profile_idx is invalid.");
-            *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
-            return QSER_RESULT_FAIL;
-        }
-    }
-
     int ret = -1;
     ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
     if(ret != 0)
@@ -838,14 +443,6 @@
         *err = QSER_DATA_CALL_ERROR_NONE;
     }
 
-#if defined(MBTK_ALL_CID_SUPPORT)
-    if(qser_default_pdp_idx == profile_idx)
-    {
-        qser_default_pdp_idx = -1;
-    }
-#endif
-    qser_idx_pdp_state[profile_idx] = false;
-
     return QSER_RESULT_SUCCESS;
 }
 
@@ -874,22 +471,6 @@
         return QSER_RESULT_FAIL;
     }
 
-    if(qser_check_profile_idx(profile_idx) < 0)
-    {
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-        if(profile_idx == 0)
-        {
-            LOGE("[qser_data] profile_idx = 0.");
-        }
-        else
-#endif
-        {
-            LOGE("[qser_data] profile_idx is invalid.");
-            *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
-            return QSER_RESULT_FAIL;
-        }
-    }
-
     int ret = -1;
     mbtk_ipv4_info_t ipv4;
     mbtk_ipv6_info_t ipv6;
@@ -1005,56 +586,26 @@
         return QSER_RESULT_FAIL;
     }
 
-    if(qser_check_profile_idx(apn->profile_idx) < 0)
-    {
-        LOGE("[qser_data] profile_idx is invalid.");
-        return QSER_RESULT_FAIL;
-    }
-
-    if(strlen(apn->apn_name) == 0)
-    {
-        LOGE("[qser_data] apn_name is NULL.");
-        return QSER_RESULT_FAIL;
-    }
-
-#if 0
-    if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
-    {
-        if(qser_apn_default_idx > -1)
-        {
-            LOGE("[qser_data] iot_default is exist.");
-            return QSER_RESULT_FAIL;
-        }
-    }
-#endif
-
-    /*add name and type verify*/
-    if (qser_check_apn_name_type(apn) < 0)
-    {
-        LOGE("[qser_data] check param error.");
-        return QSER_RESULT_FAIL;
-    }
-
-    int ret = -1;
-    char mbtk_auth[32]={0};
-    char qser_apn_type[32] = {0};
-    mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
-
+    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)
     {
-        pdp_type = MBTK_IP_TYPE_IP;
+        apninfo.ip_type = MBTK_IP_TYPE_IP;
     }
     else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
     {
-        pdp_type = MBTK_IP_TYPE_IPV6;
+        apninfo.ip_type = MBTK_IP_TYPE_IPV6;
     }
     else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
     {
-        pdp_type = MBTK_IP_TYPE_IPV4V6;
+        apninfo.ip_type = MBTK_IP_TYPE_IPV4V6;
     }
     else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
     {
-        pdp_type = MBTK_IP_TYPE_PPP;
+        apninfo.ip_type = MBTK_IP_TYPE_PPP;
     }
     else
     {
@@ -1062,72 +613,37 @@
         return QSER_RESULT_FAIL;
     }
 
-    if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
-    {
-        memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
-    }
-    else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
-    {
-        memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
-    }
-    else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
-    {
-        memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
-    }
-    #if 0
-    else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
-    {
-        //NOT SUPPORT
-    }
-    #endif
-    else
-    {
-        LOGE("[qser_data] auth input error!");
-        return QSER_RESULT_FAIL;
-    }
-
-    if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
-    {
-        LOGE("[qser_data] setapn: %d, %d, %s, %s, %s, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
-    }
-    else
-    {
-        LOGE("[qser_data] setapn: %d, %d, %s, NULL, NULL, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
-    }
     
-    ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
-    if(ret < 0)
+    apninfo.req_type = MBTK_APN_REQ_TYPE_SET;
+    apninfo.auth_proto = (mbtk_apn_auth_proto_enum)apn->auth_proto;
+    if(strlen(apn->apn_name))
     {
-        LOGE("[qser_data] mbtk_apn_set fail!");
+        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;
     }
 
-    sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
-    property_set(qser_apn_type, apn->apn_type);
-    if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE)
-    {
-        qser_apn_auth_state[apn->profile_idx] = '1';
-    }
-    else
-    {
-        qser_apn_auth_state[apn->profile_idx] = '0';
-    }
-    property_set("persist.qser.apn.auth", qser_apn_auth_state);
-    memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
-
-#if defined(MBTK_ALL_CID_SUPPORT)
-    if(strcmp(apn->apn_type, "iot_default") == 0)
-    {
-        qser_apn_add_save_state[apn->profile_idx] = '2';
-        qser_apn_default_idx = apn->profile_idx;
-    }
-    else
-#endif
-    {
-        qser_apn_add_save_state[apn->profile_idx] = '1';
-    }
-
-    property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
     return QSER_RESULT_SUCCESS;
 }
 
@@ -1147,21 +663,10 @@
         return QSER_RESULT_FAIL;
     }
 
-    if(qser_check_profile_idx(profile_idx) < 0)
-    {
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-        if(profile_idx != 0)
-#endif
-        {
-            LOGE("[qser_data] profile_idx is invalid.");
-            return QSER_RESULT_FAIL;
-        }
-    }
-
     //get apn info
-    mbtk_apn_info_t apns[10] = {0};
+    mbtk_qser_apn_info_s apns[10] = {0};
     int apn_num = 10;
-    int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
+    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);
@@ -1204,56 +709,71 @@
         return QSER_RESULT_FAIL;
     }
     
-    if(apn == NULL)
+    if(apn == NULL || profile_idx == NULL)
     {
         LOGE("[qser_data] apn param is NULL.");
         return QSER_RESULT_FAIL;
     }
 
-#if 0
-    if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
-    {
-        if(qser_apn_default_idx > -1)
-        {
-            LOGE("[qser_data] iot_default is exist.");
-            return QSER_RESULT_FAIL;
-        }
-    }
-    /*add name and type verify*/
-    if (qser_check_apn_name_type(apn) < 0)
-    {
-        LOGE("[qser_data] check param error.");
-        return QSER_RESULT_FAIL;
-    }
-#endif
-
     int ret = 0;
-    char idx = qser_get_apn_profile_idx();
-    if(idx > QSER_PROFILE_IDX_MAX)
+    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)
     {
-        LOGE("[qser_data] idx is full.");
-        return QSER_RESULT_FAIL;
+        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
     {
-        qser_apn_info_state[idx] = TRUE;
-        qser_apn_info_s set_apn;
-        set_apn.profile_idx = idx;
-        set_apn.pdp_type = apn->pdp_type;
-        set_apn.auth_proto = apn->auth_proto;
-        memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
-        memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
-        memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
-        memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
-        ret = qser_apn_set(&set_apn);
-        if(ret != 0)
-        {
-            LOGE("[qser_data] qser_apn_set fail.");
-            qser_apn_info_state[idx] = FALSE;
-            return QSER_RESULT_FAIL;
-        }
-        *profile_idx = idx;
+        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));
+    }
+    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, 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;
 }
 
@@ -1267,38 +787,13 @@
         LOGE("[qser_data] handle is NULL.");
         return QSER_RESULT_FAIL;
     }
-    
-    if(qser_idx_pdp_state[profile_idx] == true)
-    {
-        LOGE("[qser_data] profile_idx[%d] open pdp.", profile_idx);
-        return QSER_RESULT_FAIL;
-    }
-
-    if(qser_check_profile_idx(profile_idx) < 0)
-    {
-        LOGE("[qser_data] profile_idx is invalid.");
-        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;
     }
-
-    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;
 }
 
@@ -1318,11 +813,9 @@
         return QSER_RESULT_FAIL;
     }
 
-    property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
-    LOGE("[qser_data] qser_apn_add_save_state = %s", qser_apn_add_save_state);
-    mbtk_apn_info_t apns[10] = {0};
+    mbtk_qser_apn_info_s apns[10] = {0};
     int apn_num = 10;
-    int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
+    int ret = mbtk_qser_apn_get(qser_info_handle, &apn_num, apns);
     if(ret != 0)
     {
         if(ret == MBTK_INFO_ERR_NO_APN)
@@ -1341,16 +834,6 @@
             apn_list->cnt = 0;
             for(i = 0; i < apn_num; i++)
             {
-                if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
-                {
-#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
-                    if((apns[i].cid - 1) != 0)
-#endif
-                    {
-                        LOGE("[qser_data] idx no open.");
-                        continue;
-                    }
-                }
                 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");