[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;