[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/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
index 49244e3..3304725 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
@@ -3,7 +3,7 @@
 DESCRIPTION = "lynq call"

 LICENSE = "MediaTekProprietary"

 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"

-DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log liblynq-shm"

+DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log liblynq-shm liblynq-uci"

 inherit workonsrc

 WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-data"

 

diff --git a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
index d6fb6cd..3ea7719 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -107,6 +107,18 @@
     }
     bool apnHasCreated = FALSE;
     Parcel p;
+    if(urc_response->pdnState == PDN_TIMEOUT_CANCEL)
+    {
+        p.writeInt32(1);
+        p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+        p.writeInt32(0);//temporary plan
+        p.writeInt32(urc_response->pdnState);
+        writeStringToParcel(p,urc_response->apnName);
+        writeStringToParcel(p,urc_response->apnType);
+        writeStringToParcel(p,urc_response->ifname);
+        android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
+        return 0;
+    }
     if(urc_response->cId > 0)
     {
         if(urc_response->pdnState==PDN_DISCONNECTED)//if user disable data call,the pdn state wiil change to disconnected.
@@ -417,6 +429,8 @@
         return "PDN_RETRYING";
     case RIL_Data_Call_PdnState::PDN_SCANNING:
         return "PDN_SCANNING";
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+        return "PDN_TIMEOUT_CANCEL";
     default:
         return "UNKNOWN";
     }
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index facd0fe..248000d 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/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;
diff --git a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
index dad33d5..dfc2f46 100644
--- a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
+++ b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
@@ -405,6 +405,7 @@
     PDN_RETRYING,
     PDN_FAILED,
     PDN_SCANNING,
+    PDN_TIMEOUT_CANCEL,
 } RIL_Data_Call_PdnState;
 /// @}
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
index 4cb9bd2..758f54a 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
@@ -365,7 +365,19 @@
             ApnContext::mRpDataController->notifyWorld(urc);
         }
         break;
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+    {
+        urcParcel = urc->getParcel();
+        urcParcel->setDataPosition(sizeof(int32_t) * 2);
 
+        RpDataUtils::fillDataCallResponse(urcParcel, Data_Call_Response_v1);
+
+        RFX_LOG_D(RFX_LOG_TAG, "ApnContext(%s) ::notifyStateChange with newState = %s, with Urc: %s",
+                   mApnType.c_str(), RpDataUtils::apnState2string(newState), RpDataUtils::requestOrUrcToString(urc->getId()));
+
+        ApnContext::mRpDataController->notifyWorld(urc);
+        break;
+    }
     case RIL_Data_Call_PdnState::PDN_IDLE:
     default:
         RFX_LOG_D(RFX_LOG_TAG, "ApnContext(%s)::notifyStateChange: unknown state.", mApnType.c_str());
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
index e39f4be..aeb0699 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
@@ -1210,6 +1210,10 @@
             }
             return;
         }
+        apnContext->setSate(RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL);
+        RFX_LOG_D(RFX_LOG_TAG, "reTrySetupData, retry with apnType: %s,RIL_Data_Call_PdnState::PDN_FAILED, delay time: %ld",
+                apnType.c_str(),
+                delay);
     } else {
         string str;
         if (!apnContext->isEnabled()) {
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
index df79299..7f2a987 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
@@ -354,6 +354,8 @@
         return "PDN_RETRYING";
     case RIL_Data_Call_PdnState::PDN_SCANNING:
         return "PDN_SCANNING";
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+        return "PDN_TIMEOUT_CANCEL";
     }
 }