[Feature][DATA][T8TSK-282] Optimize data call timeout mechanism

Only Configure: No
Affected branch: ALL
Affected module: DATA
Is it affected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update:No

Change-Id: Ie8a23ade1d225b0ba47c695198841a1a10f3a07e
diff --git a/lib/liblynq-data/lynq_data.cpp b/lib/liblynq-data/lynq_data.cpp
index facd0fe..248000d 100755
--- a/lib/liblynq-data/lynq_data.cpp
+++ b/lib/liblynq-data/lynq_data.cpp
@@ -62,6 +62,18 @@
     LYNQ_E_NULL_ANONALY=9001
 }LYNQ_E;
 
+typedef enum {
+    PDN_IDLE,
+    PDN_CONNECTING,
+    PDN_CONNECTED,
+    PDN_DISCONNECTING,
+    PDN_DISCONNECTED,
+    PDN_RETRYING,
+    PDN_FAILED,
+    PDN_SCANNING,
+    PDN_TIMEOUT_CANCEL,
+} RIL_Data_Call_PdnState;
+
 int lynq_client_sockfd = 0;
 int Global_uToken = 0;
 struct sockaddr_in lynq_data_socket_server_addr;
@@ -102,6 +114,7 @@
 * @brief temp of apn result info
 */
 char g_lynq_apn_result[1024] = {};
+int g_data_call_timeout_value = LYNQ_DATA_TIME_OUT;
 
 static std::vector<int> s_data_urc_wait_list;
 
@@ -627,7 +640,7 @@
             bzero(apn,LYNQ_APN_MAX_LEN);
             bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
             bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
-            if(pdnState!=4)//PDN_DISCONNECTED
+            if(pdnState != RIL_Data_Call_PdnState::PDN_DISCONNECTED)//PDN_DISCONNECTED
             {
                 urc_msg = strdupReadString_p(p);
                 int len = strlen(urc_msg);
@@ -709,8 +722,15 @@
                         LYERRLOG("client still without res");
                         break;
                     }
+                    if(pdnState == RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL)
+                    {
+                        lynq_data_call = LYNQ_E_TIME_OUT;
+                    }
+                    else
+                    {
+                        lynq_data_call = 0;
+                    }
                     sendSignalDataCallStateChange();
-                    lynq_data_call = 0;
                     data_timelimit = 0;
                 }
                 printf_apn_table_debug(__FUNCTION__,__LINE__);
@@ -842,6 +862,7 @@
 int get_imsi();
 int check_apn_status();
 
+int get_timeout_value();
 int lynq_init_data(int uToken)
 {
     if (g_lynq_data_init_flag == 1)
@@ -854,6 +875,15 @@
     Global_uToken = uToken;
     LYLOGSET(LOG_INFO);
     LYLOGEINIT(USER_LOG_TAG);
+    int ret = get_timeout_value();
+    if(ret >= 30000)
+    {
+        g_data_call_timeout_value = ret;
+    }
+    else
+    {
+        LYERRLOG("timeout must greater or equal to 30s!!!");
+    }
     result = lynq_socket_client_start();
     pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
     if(result!=0)
@@ -952,6 +982,11 @@
 int lynq_setup_data_call(int *handle)
 {
     int error = -1;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     #ifdef GSW_RIL_CFG  //becuase gsw not have connman,data can not be triggered by connman.
     LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
     error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL);
@@ -1005,7 +1040,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if (waitDataCallstateChange(LYNQ_DATA_TIME_OUT) == ETIMEDOUT)
+        if (waitDataCallstateChange(g_data_call_timeout_value) == ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -1019,6 +1054,13 @@
             printf_apn_table_debug(__FUNCTION__,__LINE__);
             return error;
         }
+        if(lynq_data_call == LYNQ_E_TIME_OUT)
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
+            printf_apn_table_debug(__FUNCTION__,__LINE__);
+            return error;
+        }
     }
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     #endif //GSW_RIL_CFG
@@ -1035,6 +1077,11 @@
     int error = -1;
     int lynq_data_call_id = -1;
     int ret = 0;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     if(handle==NULL)
     {
         LYERRLOG("handle is null!!!");
@@ -1106,6 +1153,11 @@
     int error = -1;
     int lynq_data_call_id = -1;
     char *argv[10] = {};
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     #ifdef GSW_RIL_CFG
     LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
     if(handle==NULL||apnType==NULL)
@@ -1209,7 +1261,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if(waitDataCallstateChange(LYNQ_DATA_TIME_OUT)==ETIMEDOUT)
+        if(waitDataCallstateChange(g_data_call_timeout_value)==ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -1223,6 +1275,13 @@
             printf_apn_table_debug(__FUNCTION__,__LINE__);
             return error;
         }
+        if(lynq_data_call == LYNQ_E_TIME_OUT)
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
+            printf_apn_table_debug(__FUNCTION__,__LINE__);
+            return error;
+        }
     }
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     return error;
@@ -1390,6 +1449,11 @@
     int number = 0;
     int lynq_data_call_id = 0;
     int error = 0;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return -1;
+    }
     lynq_data_call_id = *handle;
     if((handle==NULL) || (dataCallList==NULL))
     {
@@ -1930,6 +1994,24 @@
     }
     return 0;
 }
+int get_timeout_value()
+{
+    LYINFLOG("get_timeout_value enter");
+    int ret = -1;
+    char timeout_value[8] ={0};//get get_timeout_value
+    ret = lynq_get_value("lynq_uci","data_call","timeout",timeout_value);
+    if(ret == 0)
+    {
+        LYINFLOG("data_call.timeout is %s",timeout_value);
+        return atoi(timeout_value);
+    }
+    else
+    {
+        LYERRLOG("get_timeout_value");
+        return -1;
+    }
+}
+
 int radio_switch(int status)
 {
     Parcel *p =NULL;