Add mbtk_source git commit info

Change-Id: I9867613657db269bba81d28c4b3712062ae41bdd
diff --git a/mbtk/mbtk_rild_v2/src/ril_net.c b/mbtk/mbtk_rild_v2/src/ril_net.c
index 6e0cd8c..3592850 100755
--- a/mbtk/mbtk_rild_v2/src/ril_net.c
+++ b/mbtk/mbtk_rild_v2/src/ril_net.c
@@ -21,10 +21,11 @@
 #include "mbtk_str.h"
 
 mbtk_cell_pack_info_t cell_info;
+ril_cgact_wait_t cgact_wait;
 
 extern ril_band_info_t band_info;
 void ril_rsp_pack_send(int fd, int ril_id, int msg_index, const void* data, int data_len);
-static int req_apn_get(mbtk_apn_info_array_t *apns, int *cme_err);
+static int req_apn_get(bool get_def_cid, mbtk_apn_info_array_t *apns, int *cme_err);
 static int req_apn_set(mbtk_apn_info_t *apn, int *cme_err);
 static void apn_prop_get(ril_apn_info_array_t *apns);
 
@@ -66,7 +67,7 @@
     return TRUE;
 }
 
-static int apn_cid_reset(mbtk_apn_info_t *apn)
+static int apn_check_and_cid_reset(mbtk_apn_info_t *apn)
 {
     // Delete apn
     if(str_empty(apn->apn)) {
@@ -76,10 +77,11 @@
         if(!apn_conf_support(MBTK_RIL_CID_DEF) && apn->cid == MBTK_RIL_CID_DEF)
             return -1;
 
+        // The cid no use,so can not delete.
         mbtk_apn_info_array_t apns;
         int cme_err = MBTK_RIL_ERR_CME_NON;
         memset(&apns, 0, sizeof(mbtk_apn_info_array_t));
-        if(req_apn_get(&apns, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+        if(req_apn_get(FALSE, &apns, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
         {
             LOGW("Get APN fail.");
             return 0;
@@ -94,27 +96,33 @@
             }
             return -1;
         }
-    } else {
-        if(apn->cid == MBTK_RIL_CID_NUL) {
-            int start_cid;
-            bool asr_auto_call_open = !apn_conf_support(MBTK_RIL_CID_DEF);
-            mbtk_apn_info_array_t apns;
-            int cme_err = MBTK_RIL_ERR_CME_NON;
-            if(asr_auto_call_open) {
-                start_cid = MBTK_RIL_CID_2;
-            } else {
-                start_cid = MBTK_APN_CID_MIN;
-            }
-            memset(&apns, 0, sizeof(mbtk_apn_info_array_t));
-            if(req_apn_get(&apns, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
-            {
-                LOGW("Get APN fail.");
+    } else { // Add or change APN.
+        int start_cid;
+        bool asr_auto_call_open = !apn_conf_support(MBTK_RIL_CID_DEF);
+        mbtk_apn_info_array_t apns;
+        int cme_err = MBTK_RIL_ERR_CME_NON;
+
+        if(asr_auto_call_open) {
+            start_cid = MBTK_RIL_CID_2;
+        } else {
+            start_cid = MBTK_APN_CID_MIN;
+        }
+        memset(&apns, 0, sizeof(mbtk_apn_info_array_t));
+        if(req_apn_get(TRUE, &apns, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+        {
+            LOGW("Get APN fail.");
+            if(apn->cid == MBTK_RIL_CID_NUL) {
                 apn->cid = start_cid;
             }
-            else
-            {
+        }
+        else
+        {
+            int index = 0;
+            bool is_change = FALSE;  // Is add APN default.
+
+            if(apn->cid == MBTK_RIL_CID_NUL) { // Is add (auto set cid).
                 for(; start_cid <= MBTK_APN_CID_MAX; start_cid++) {
-                    int index = 0;
+                    index = 0;
                     while(index < apns.num) {
                         if(apns.apns[index].cid == start_cid)
                             break;
@@ -124,7 +132,8 @@
                     if(index == apns.num) { // Found not used cid : start_cid.
                         LOGD("Change CID : %d -> %d", apn->cid, start_cid);
                         apn->cid = start_cid;
-                        return 0;
+                        // return 0;
+                        break;
                     }
                 }
 
@@ -132,6 +141,28 @@
                     LOGE("APN full.");
                     return -1;
                 }
+                is_change = FALSE;
+            } else {
+                index = 0;
+                while(index < apns.num) {
+                    if(apns.apns[index].cid == apn->cid) {
+                        is_change = TRUE;
+                        break;
+                    }
+                    index++;
+                }
+            }
+
+            // Is add,the APN can't same.
+            if(!is_change) {
+                index = 0;
+                while(index < apns.num) {
+                    if(strcmp(apns.apns[index].apn,apn->apn) == 0) {
+                        LOGW("APN : %s exist.", apn->apn);
+                        return -1;
+                    }
+                    index++;
+                }
             }
         }
     }
@@ -149,11 +180,16 @@
     // If auto data call is open,the default route is CID 1.
     if(asr_auto_call_open) {
         apns->cid_for_def_route = MBTK_RIL_CID_DEF;
+        apns->cid_for_dns = MBTK_RIL_CID_DEF;
         cid = MBTK_RIL_CID_2;
     } else {
         if(property_get(MBTK_DEF_ROUTE_CID, prop_data, "") > 0 && !str_empty(prop_data)) {
             apns->cid_for_def_route = (mbtk_ril_cid_enum)atoi(prop_data);
         }
+        memset(prop_data, 0, sizeof(prop_data));
+        if(property_get(MBTK_DEF_DNS_CID, prop_data, "") > 0 && !str_empty(prop_data)) {
+            apns->cid_for_dns = (mbtk_ril_cid_enum)atoi(prop_data);
+        }
         cid = MBTK_APN_CID_MIN;
     }
     for(; cid <= MBTK_APN_CID_MAX; cid++) {
@@ -295,6 +331,11 @@
         prop_data[0] = '0' + apn->cid;
         ret = property_set(MBTK_DEF_ROUTE_CID, prop_data);
     }
+    if(apn->as_dns) {
+        memset(prop_data, 0, sizeof(prop_data));
+        prop_data[0] = '0' + apn->cid;
+        ret = property_set(MBTK_DEF_DNS_CID, prop_data);
+    }
     return ret;
 }
 
@@ -306,10 +347,28 @@
     } else {
         apn.auto_boot_call = data_info->auto_boot_call;
         apn.def_route = data_info->def_route;
+        apn.as_dns = data_info->as_dns;
         return apn_prop_set(&apn);
     }
 }
 
+static int wait_cgact_complete(int timeout)
+{
+    int count = timeout * 10; // timeout * 1000 / 100
+    int i = 0;
+
+    while(cgact_wait.waitting && i < count) {
+        i++;
+        usleep(100000); // 100ms
+    }
+
+    memset(&cgact_wait, 0, sizeof(ril_cgact_wait_t));
+    if(i == count) { // Timeout
+        return -1;
+    } else {
+        return 0;
+    }
+}
 
 /*
 AT+COPS=?
@@ -1484,7 +1543,7 @@
 OK
 
 */
-static int req_apn_get(mbtk_apn_info_array_t *apns, int *cme_err)
+static int req_apn_get(bool get_def_cid, mbtk_apn_info_array_t *apns, int *cme_err)
 {
     ATResponse *response = NULL;
     int err = at_send_command_multiline("AT+CGDCONT?", "+CGDCONT:", &response);
@@ -1500,6 +1559,16 @@
     char *line = NULL;
     int tmp_int;
     char *tmp_str = NULL;
+    int cid_start;
+    if(apn_conf_support(MBTK_RIL_CID_DEF)) {
+        cid_start = MBTK_RIL_CID_DEF;
+    } else {
+        if(get_def_cid) {
+            cid_start = MBTK_RIL_CID_DEF;
+        } else {
+            cid_start = MBTK_RIL_CID_2;
+        }
+    }
     /*
     <apn_num[1]><cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth_len[2]><auth>...
                 <cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth_len[2]><auth>
@@ -1519,7 +1588,7 @@
             goto exit;
         }
         // Only get CID 1-7
-        if(tmp_int >= MBTK_APN_CID_MIN && tmp_int <= MBTK_APN_CID_MAX) {
+        if(tmp_int >= cid_start && tmp_int <= MBTK_APN_CID_MAX) {
             apns->apns[apns->num].cid = (mbtk_ril_cid_enum)tmp_int;
 
             err = at_tok_nextstr(&line, &tmp_str);// ip type
@@ -1655,12 +1724,16 @@
 OK
 
 */
-static int req_data_call_start(mbtk_ril_cid_enum cid, bool def_route,
-                int retry_interval, int timeout, mbtk_ip_info_t *ip_info, int *cme_err)
+static int req_data_call_start(mbtk_ril_cid_enum cid, bool def_route, bool as_dns,
+                int retry_interval, int timeout, int *cme_err)
 {
     ATResponse *response = NULL;
     char cmd[400] = {0};
     int err = 0;
+    memset(&cgact_wait, 0, sizeof(ril_cgact_wait_t));
+    cgact_wait.waitting = true;
+    cgact_wait.cid = cid;
+    cgact_wait.act = true;
 
     sprintf(cmd, "AT+CGACT=1,%d", cid);
     err = at_send_command(cmd, &response);
@@ -1687,6 +1760,11 @@
     char cmd[400] = {0};
     int err = 0;
 
+    memset(&cgact_wait, 0, sizeof(ril_cgact_wait_t));
+    cgact_wait.waitting = true;
+    cgact_wait.cid = cid;
+    cgact_wait.act = false;
+
     sprintf(cmd, "AT+CGACT=0,%d", cid);
     err = at_send_command(cmd, &response);
     if (err < 0 || response->success == 0){
@@ -2089,7 +2167,7 @@
             {
                 mbtk_apn_info_array_t apns;
                 memset(&apns, 0, sizeof(mbtk_apn_info_array_t));
-                if(req_apn_get(&apns, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+                if(req_apn_get(FALSE, &apns, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
                 {
                     if(cme_err != MBTK_RIL_ERR_CME_NON) {
                         err = MBTK_RIL_ERR_CME + cme_err;
@@ -2107,7 +2185,7 @@
             else     // Set
             {
                 mbtk_apn_info_t *apn = (mbtk_apn_info_t*)pack->data;
-                if(apn_cid_reset(apn)) {
+                if(apn_check_and_cid_reset(apn)) {
                     err = MBTK_RIL_ERR_CID;
                 } else {
                     if(apn_conf_support(apn->cid)) {
@@ -2144,58 +2222,104 @@
             else     // Set
             {
                 mbtk_data_call_info_t *call_info = (mbtk_data_call_info_t*)pack->data;
-                if(call_info->type == MBTK_DATA_CALL_START) {
-                    mbtk_ip_info_t ip_info;
-                    memset(&ip_info, 0, sizeof(ip_info));
-                    if(apn_prop_reset(call_info)) {
-                        err = MBTK_RIL_ERR_REQ_UNKNOWN;
-                        LOG("apn_prop_reset() fail.");
-                    } else {
-                        if(req_data_call_start(call_info->cid, call_info->def_route,
-                                call_info->retry_interval, call_info->timeout, &ip_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+                if(!apn_conf_support(call_info->cid)) {
+                    err = MBTK_RIL_ERR_UNSUPPORTED;
+                    LOGD("Can not data call for CID : %d", call_info->cid);
+                } else {
+                    if(call_info->type == MBTK_DATA_CALL_START) {
+                        mbtk_ip_info_t ip_info;
+                        memset(&ip_info, 0, sizeof(ip_info));
+#if 0
+                        if(apn_prop_reset(call_info)) {
+                            err = MBTK_RIL_ERR_REQ_UNKNOWN;
+                            LOG("apn_prop_reset() fail.");
+                        } else
+#else
+                        if(apn_prop_reset(call_info)) {
+                            LOG("apn_prop_reset() fail.");
+                        }
+#endif
+                        {
+                            if(req_data_call_start(call_info->cid, call_info->def_route, call_info->as_dns,
+                                    call_info->retry_interval, call_info->timeout, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+                            {
+                                if(cme_err != MBTK_RIL_ERR_CME_NON) {
+                                    err = MBTK_RIL_ERR_CME + cme_err;
+                                } else {
+                                    err = MBTK_RIL_ERR_UNKNOWN;
+                                }
+                                LOGD("Start data call fail.");
+                            }
+                            else
+                            {
+                                // Wait for "CONNECT" or "+CGEV:"
+                                if(wait_cgact_complete(call_info->timeout)) { // Timeout
+                                    err = MBTK_RIL_ERR_TIMEOUT;
+                                    break;
+                                }
+
+                                // Get Ip informations.
+                                cme_err = MBTK_RIL_ERR_CME_NON;
+                                if(req_data_call_state_get(call_info->cid ,&ip_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+                                {
+                                    LOGD("Get net informations fail.");
+                                    err = MBTK_RIL_ERR_NET_CONF;
+                                }
+                                else
+                                {
+                                    // Config network informations.
+                                    if(net_ifc_reconfig(call_info->cid, call_info->def_route, call_info->as_dns, &ip_info)) {
+                                        err = MBTK_RIL_ERR_NET_CONF;
+                                        break;
+                                    }
+
+                                    ril_rsp_pack_send(cli_info->fd, pack->msg_id, pack->msg_index, &ip_info, sizeof(mbtk_ip_info_t));
+                                }
+                            }
+                        }
+                    } else if(call_info->type == MBTK_DATA_CALL_STOP) {
+                        if(req_data_call_stop(call_info->cid, call_info->timeout, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
                         {
                             if(cme_err != MBTK_RIL_ERR_CME_NON) {
                                 err = MBTK_RIL_ERR_CME + cme_err;
                             } else {
                                 err = MBTK_RIL_ERR_UNKNOWN;
                             }
-                            LOGD("Start data call fail.");
+                            LOGD("Stop data call fail.");
+                        }
+                        else
+                        {
+                            // Wait for "CONNECT" or "+CGEV:"
+                            if(wait_cgact_complete(call_info->timeout)) { // Timeout
+                                err = MBTK_RIL_ERR_TIMEOUT;
+                                break;
+                            }
+
+                            // Clean network config.
+                            if(net_ifc_config(call_info->cid, FALSE, FALSE, NULL)) {
+                                err = MBTK_RIL_ERR_NET_CONF;
+                                break;
+                            }
+
+                            ril_rsp_pack_send(cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
+                        }
+                    } else {
+                        mbtk_ip_info_t ip_info;
+                        memset(&ip_info, 0, sizeof(ip_info));
+                        if(req_data_call_state_get(call_info->cid ,&ip_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+                        {
+                            if(cme_err != MBTK_RIL_ERR_CME_NON) {
+                                err = MBTK_RIL_ERR_CME + cme_err;
+                            } else {
+                                err = MBTK_RIL_ERR_UNKNOWN;
+                            }
+                            LOGD("Get data call state fail.");
                         }
                         else
                         {
                             ril_rsp_pack_send(cli_info->fd, pack->msg_id, pack->msg_index, &ip_info, sizeof(mbtk_ip_info_t));
                         }
                     }
-                } else if(call_info->type == MBTK_DATA_CALL_STOP) {
-                    if(req_data_call_stop(call_info->cid, call_info->timeout, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
-                    {
-                        if(cme_err != MBTK_RIL_ERR_CME_NON) {
-                            err = MBTK_RIL_ERR_CME + cme_err;
-                        } else {
-                            err = MBTK_RIL_ERR_UNKNOWN;
-                        }
-                        LOGD("Stop data call fail.");
-                    }
-                    else
-                    {
-                        ril_rsp_pack_send(cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
-                    }
-                } else {
-                    mbtk_ip_info_t ip_info;
-                    memset(&ip_info, 0, sizeof(ip_info));
-                    if(req_data_call_state_get(call_info->cid ,&ip_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
-                    {
-                        if(cme_err != MBTK_RIL_ERR_CME_NON) {
-                            err = MBTK_RIL_ERR_CME + cme_err;
-                        } else {
-                            err = MBTK_RIL_ERR_UNKNOWN;
-                        }
-                        LOGD("Get data call state fail.");
-                    }
-                    else
-                    {
-                        ril_rsp_pack_send(cli_info->fd, pack->msg_id, pack->msg_index, &ip_info, sizeof(mbtk_ip_info_t));
-                    }
                 }
             }
             break;
@@ -2211,8 +2335,3 @@
     return err;
 }
 
-
-
-
-
-