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