T108: fix data_call

Change-Id: I48ac56b38bd7bbfaad8c310398bc3a1e7e2613d1
diff --git a/mbtk/mbtk_rild/src/mbtk_info_server.c b/mbtk/mbtk_rild/src/mbtk_info_server.c
index c253439..bc43cd4 100755
--- a/mbtk/mbtk_rild/src/mbtk_info_server.c
+++ b/mbtk/mbtk_rild/src/mbtk_info_server.c
@@ -22,6 +22,7 @@
 #include "mbtk_led.h"
 #include "cust_info.h"
 #include "mbtk_device.h"
+#include "mbtk_data_call.h"
 
 typedef struct {
     uint32 band_gsm;
@@ -5026,6 +5027,69 @@
                 }
                 break;
             }
+            case MBTK_INFO_ID_NET_QSER_APN_REQ:
+            {
+                if(pack->data_len == 0 || pack->data == NULL)
+                {
+                    uint8 buff[SOCK_MSG_LEN_MAX];
+                    memset(buff, 0, SOCK_MSG_LEN_MAX);
+                    int data_len = 0;
+                    if(mbtk_qser_req_apn_get(buff, &data_len, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                    {
+                        if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                            err = MBTK_INFO_ERR_CME + cme_err;
+                        } else {
+                            err = MBTK_INFO_ERR_UNKNOWN;
+                        }
+                        LOGE("Get APN fail.");
+                    }
+                    else
+                    {
+                        pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_RSP, buff, data_len);
+                    }
+                }
+                else
+                {
+                    const uint8* ptr = pack->data;
+                    mbtk_apn_info_t apn;
+                    mbtk_apn_req_type_enum req_type = MBTK_APN_REQ_TYPE_SET;
+                    uint8 apn_type[MBTK_QSER_APN_NAME_SIZE] = {0};
+                    int ret = mbtk_strdata_to_apn(pack->data, &apn, apn_type, &req_type);
+                    if(ret < 0)
+                    {
+                        LOGE("mbtk_strdata_to_apn fail. ret = [%d]", ret);
+                        err = MBTK_INFO_ERR_REQ_PARAMETER;
+                    }
+                    else
+                    {
+                        if(req_apn_set(&apn, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                        {
+                            if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                                err = MBTK_INFO_ERR_CME + cme_err;
+                            } else {
+                                err = MBTK_INFO_ERR_UNKNOWN;
+                            }
+                            LOGE("Set APN fail.");
+                        }
+                        else
+                        {
+                            // Save apn.
+                            apn_prop_set(&apn);
+                            mbtk_qser_apn_save(apn, apn_type, true);
+                            if(req_type == MBTK_APN_REQ_TYPE_ADD)
+                            {
+                                pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_QSER_APN_RSP, (void *)&apn.cid, 1);
+                            }
+                            else
+                            {
+                                pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_QSER_APN_RSP, NULL, 0);
+                            }
+                        }
+                    }
+                }
+
+                break;
+            }
             case MBTK_INFO_ID_NET_APN_DEL_REQ:
             {
                 if(pack->data_len == 0 || pack->data == NULL)
@@ -5036,18 +5100,31 @@
                 else
                 {
                     int profile = pack->data[0];
-                    if(req_apn_del(profile, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                    if(cid_active[profile] == 1)
                     {
-                        if(cme_err != MBTK_INFO_ERR_CME_NON) {
-                            err = MBTK_INFO_ERR_CME + cme_err;
-                        } else {
-                            err = MBTK_INFO_ERR_UNKNOWN;
-                        }
-                        LOG("Delete apn fail.");
+                        LOGD("cid pdp already open.");
+                        err = MBTK_INFO_ERR_CID_EXIST;
+                    }
+                    if(mbtk_qser_apn_del(profile) < 0)
+                    {
+                        LOGD("del error.");
+                        err = MBTK_INFO_ERR_REQ_PARAMETER;
                     }
                     else
                     {
-                        pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_DEL_RSP, NULL, 0);
+                        if(req_apn_del(profile, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+                        {
+                            if(cme_err != MBTK_INFO_ERR_CME_NON) {
+                                err = MBTK_INFO_ERR_CME + cme_err;
+                            } else {
+                                err = MBTK_INFO_ERR_UNKNOWN;
+                            }
+                            LOG("Delete apn fail.");
+                        }
+                        else
+                        {
+                            pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_DEL_RSP, NULL, 0);
+                        }
                     }
                 }
                 break;
@@ -5069,10 +5146,17 @@
                     int cid = pack->data[1];
                     int reconn = 0;
 
+#if 0
                     if(cid < MBTK_APN_CID_MIN || cid > MBTK_APN_CID_MAX) {
                         err = MBTK_INFO_ERR_CID;
                         break;
                     }
+#endif
+                    if(mbtk_check_cid(cid) < 0)
+                    {
+                        err = MBTK_INFO_ERR_CID;
+                        break;
+                    }
 
                     LOG("cid_active[%d] = %d", cid, cid_active[cid]);
                     memset(&cgact_wait, 0, sizeof(info_cgact_wait_t));
@@ -5096,6 +5180,12 @@
                                 break;
                             }
 
+                            if(mbtk_check_default_pdp_state(cid))
+                            {
+                                err = MBTK_INFO_ERR_UNSUPPORTED;
+                                break;
+                            }
+
                             data_call_reconn:
                             //mbtk wyq for data_call_ex add end
                             cgact_wait.waitting = true;
@@ -5240,6 +5330,8 @@
                                     }
 
                                     cid_active[cid] = 1;
+                                    mbtk_set_default_pdp_state(true, cid);
+                                    mbtk_qser_route_config(cid, &ipv4, &ipv6);
                                     if(cli_info->fd != DATA_CALL_BOOTCONN_FD)
                                     {
                                         pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
@@ -5280,6 +5372,7 @@
                                     LOGD("Config %s IPv4 0 success.", dev);
                                 }
                                 cid_active[cid] = 0;
+                                mbtk_set_default_pdp_state(false, cid);
                                 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
                                 break;
                             }
@@ -5321,6 +5414,7 @@
                                 }
 #endif
                                 cid_active[cid] = 0;
+                                mbtk_set_default_pdp_state(false, cid);
                                 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
                             }
                             break;
@@ -6253,10 +6347,12 @@
     if(act)
     {
         cid_active[cid] = 1;
+        mbtk_set_default_pdp_state(true, cid);
     }
     else
     {
         cid_active[cid] = 0;
+        mbtk_set_default_pdp_state(false, cid);
     }
     char dev[20] = {0};
     sprintf(dev, "ccinet%d", cid - 1);
@@ -6536,8 +6632,14 @@
                     }
                     else
                     {
-                        free(pack->data);
-                        free(item->cli_info);
+                        if(pack->data != NULL)
+                        {
+                            free(pack->data);
+                        }
+                        if(item->cli_info)
+                        {
+                            free(item->cli_info);
+                        }
                     }
                 }
                 at_process = false;
@@ -6945,6 +7047,29 @@
     }
 }
 
+int mbtk_get_apn_send_pack(void)
+{
+    sock_client_info_t *info = (sock_client_info_t*)malloc(sizeof(sock_client_info_t));
+    if(info == NULL)
+    {
+        LOG("clinent_info  malloc() fail.");
+        return -1;
+    }
+    memset(info, 0, sizeof(sock_client_info_t));
+    info->fd = DATA_CALL_APN_GET_FD;
+
+    mbtk_info_pack_t* pack = mbtk_info_pack_creat(MBTK_INFO_ID_NET_QSER_APN_REQ);
+    if(pack == NULL)
+    {
+        free(info);
+        LOG("Packet malloc() fail.");
+        return -1;
+    }
+
+    send_pack_to_queue(info, pack);
+    return 0;
+}
+
 int mbtk_info_server_start()
 {
     signal(SIGPIPE, SIG_IGN);
@@ -7063,6 +7188,8 @@
 
     pthread_attr_destroy(&thread_attr);
 
+    mbtk_qser_apn_init();
+
     LOG("MBTK Information Server Start...");
 
     return 0;