Merge "[Bugfix][API-1123][DATA] data call deact apn failed for mRefCount = 0" into MR3.0-merge
diff --git a/src/lynq/framework/lynq-ril-service/src/data/data.cpp b/src/lynq/framework/lynq-ril-service/src/data/data.cpp
index d192b37..b66072b 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data.cpp
@@ -794,6 +794,7 @@
/*此处直接返回response,给client成功的结果码,并返回iface*/
Parcel urc_p;
p.writeInt32(0);
+ p.writeInt32(pRI->uToken);
p.writeInt32(pRI->pCI->requestNumber);
p.writeInt32(socket_id);
p.writeInt32(0);
@@ -812,6 +813,7 @@
}
result = setupDataCallargc(argc,argv,socket_id,pRI);
p.writeInt32 (0);
+ p.writeInt32(pRI->uToken);
p.writeInt32 (pRI->pCI->requestNumber);
p.writeInt32(socket_id);
p.writeInt32 (0);
@@ -832,6 +834,7 @@
/*此处直接返回response,给client成功的结果码,并返回iface*/
Parcel urc_p;
p.writeInt32 (0);
+ p.writeInt32(pRI->uToken);
p.writeInt32 (pRI->pCI->requestNumber);
p.writeInt32(socket_id);
p.writeInt32 (0);
@@ -857,6 +860,7 @@
updataDataConnectState(get_default_sim_data(), true);
p.writeInt32 (0);
+ p.writeInt32(pRI->uToken);
p.writeInt32 (pRI->pCI->requestNumber);
p.writeInt32(socket_id);
p.writeInt32 (0);
@@ -1056,6 +1060,7 @@
int deactivateDataCall(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI)
{
bool hasDeactivate = TRUE;
+ int err_code = 0;
Parcel p;
/*jb.qi change for swtich card after dial on 20221025 start*/
if((pRI == NULL) && (argc == 0))
@@ -1102,29 +1107,21 @@
}
if(hasDeactivate)
{
- p.writeInt32 (0);
- p.writeInt32 (pRI->pCI->requestNumber);
- p.writeInt32(socket_id);
- p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
- android::LYNQ_RIL_respSocket(p, (void *)pRI);
- return -1;
+ err_code = 8087;//not have apn this has been activate int this time.
+ RLOGD("not have apn this has been activate int this time");
}
}
else
{
- p.writeInt32 (0);
- p.writeInt32 (pRI->pCI->requestNumber);
- p.writeInt32(socket_id);
- p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
- re = deactivateDataCallarc(argc,argv,socket_id,pRI);//warren add for setup data call timeout on 20230602
- android::LYNQ_RIL_respSocket(p, (void *)pRI);
- return -1;
+ err_code = 8088;//not have any apns this has been activate int this time.
+ RLOGD("not have any apns this has been activate int this time");
}
re = deactivateDataCallarc(argc,argv,socket_id,pRI);
p.writeInt32 (0);
+ p.writeInt32(pRI->uToken);
p.writeInt32 (pRI->pCI->requestNumber);
p.writeInt32(socket_id);
- p.writeInt32 (0);//RIL_E_GENERIC_FAILURE
+ p.writeInt32 (err_code);
android::LYNQ_RIL_respSocket(p, (void *)pRI);
if (pRI != NULL)
{
@@ -1148,22 +1145,14 @@
}
if(hasDeactivate)
{
- p.writeInt32 (0);
- p.writeInt32 (pRI->pCI->requestNumber);
- p.writeInt32(socket_id);
- p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
- android::LYNQ_RIL_respSocket(p, (void *)pRI);
- return -1;
+ err_code = 8087;//not have apn this has been activate int this time.
+ RLOGD("not have apn this has been activate int this time");
}
}
else
{
- p.writeInt32 (0);
- p.writeInt32 (pRI->pCI->requestNumber);
- p.writeInt32(socket_id);
- p.writeInt32 (2);//RIL_E_GENERIC_FAILURE
- android::LYNQ_RIL_respSocket(p, (void *)pRI);
- return -1;
+ err_code = 8088;//not have any apns this has been activate int this time.
+ RLOGD("not have any apns this has been activate int this time");
}
char cmd[256];
getCellularService();
@@ -1174,9 +1163,10 @@
memset(csname, 0, 27*sizeof(char));
updataDataConnectState(get_default_sim_data(), false);
p.writeInt32 (0);
+ p.writeInt32(pRI->uToken);
p.writeInt32 (pRI->pCI->requestNumber);
p.writeInt32(socket_id);
- p.writeInt32 (0);//RIL_E_GENERIC_FAILURE
+ p.writeInt32 (err_code);//RIL_E_GENERIC_FAILURE
android::LYNQ_RIL_respSocket(p, (void *)pRI);
/* no response from telecore, free pRI prevent memory leak */
if (pRI != NULL) {
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 9d3e4d2..370e2ac 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
@@ -307,6 +307,31 @@
{
RLOGD("for apn_table[%d].apn:%s,apntype:%s,used:%d,apnstatus:%d\n",i,apn_table[i].apn,
apn_table[i].apntype,apn_table[i].used,apn_table[i].apnstatus);
+ if((strcmp(apn_table[i].apntype,urc_response->apnType)==0))
+ {
+ apn_table[i].pdpstate = urc_response->pdnState;
+ char ptr[1] = "";
+ if(NULL == urc_response->ifname)
+ {
+ memcpy(apn_table[i].ifaceName, ptr,strlen(ptr)+1);
+ }
+ if(NULL == urc_response->addresses)
+ {
+ memcpy(apn_table[i].address, ptr, strlen(ptr)+1);
+ }
+ memcpy(iface_t,apn_table[i].ifaceName,strlen(apn_table[i].ifaceName)+1);
+ memcpy(apnType_t,apn_table[i].apntype,strlen(apn_table[i].apntype)+1);
+ memcpy(apn_t,apn_table[i].apn,strlen(apn_table[i].apn)+1);
+ p.writeInt32(1);
+ p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+ p.writeInt32(0);//temporary plan
+ p.writeInt32(urc_response->pdnState);
+ writeStringToParcel(p,apn_t);
+ writeStringToParcel(p,apnType_t);
+ writeStringToParcel(p,iface_t);
+ android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
+ RLOGD("cid is %d apn:%s,apntype:%s",urc_response->cId,apn_table[i].apn,apn_table[i].apntype);
+ }
}
return 0;
}
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 4a629cd..aaddeb4 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -25,7 +25,7 @@
#define USER_LOG_TAG "LYNQ_DATA"
#define LYNQ_DATA_UCI_BUF 258
-#define LYNQ_DATA_TIME_OUT 1000*180
+#define LYNQ_DATA_TIME_OUT 1000*120
#define LYNQ_ADDRESS "127.0.0.1"
@@ -51,6 +51,10 @@
/*Failed to execute sql statement*/
LYNQ_E_SMS_SQL_FAIL = 8006,
LYNQ_E_SMS_NOT_FIND = 8007,
+ LYNQ_E_GET_RESP_FAIL = 8008,
+ LYNQ_E_NOT_THIS_APN = 8087,
+ LYNQ_E_NOT_ANY_APN = 8088,
+ LYNQ_E_MD_NOT_READY = 8089,
/* The logic conflict*/
LYNQ_E_CONFLICT=9000,
/*Null anomaly*/
@@ -67,6 +71,10 @@
static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t s_data_call_deactived_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_data_call_deactived_cond = PTHREAD_COND_INITIALIZER;
+
+
static pthread_mutex_t s_lynq_apn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t s_lynq_apn_change_cond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t s_lynq_urc_vector_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -299,6 +307,31 @@
pthread_mutex_unlock(&s_data_call_state_change_mutex);
return;
}
+int waitDeactived(int mtime)
+{
+ int ret = 0;
+ int sec = 0;
+ int usec = 0;
+ struct timeval now;
+ struct timespec timeout;
+ gettimeofday(&now,NULL);
+ sec = mtime/1000;
+ usec = mtime%1000;
+ timeout.tv_sec = now.tv_sec+sec;
+ timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
+ pthread_mutex_lock(&s_data_call_deactived_mutex);
+ ret = pthread_cond_timedwait(&s_data_call_deactived_cond,&s_data_call_deactived_mutex,&timeout);
+ pthread_mutex_unlock(&s_data_call_deactived_mutex);
+ return ret;
+}
+void sendSignalDeactvied()
+{
+ pthread_mutex_lock(&s_data_call_deactived_mutex);
+ pthread_cond_signal(&s_data_call_deactived_cond);
+ pthread_mutex_unlock(&s_data_call_deactived_mutex);
+ return;
+}
+
void sendSignalPdnChange()
{
pthread_mutex_lock(&s_lynq_urc_vector_mutex);
@@ -326,14 +359,98 @@
}
return 0;
}
-int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
+/**@brief get utoken in range 0 to 10000
+* @return utoken
+*/
+int get_utoken()
{
- if(p.dataAvail() > 0)
+ return (Global_uToken++)%10000;/*0-10000*/
+}
+/**@brief wait response with expected token and write msg to parcel in some time
+* @param fd [IN]: socket fd
+* @param p [OUT]: quote the parcel,if return success need delete p.
+* @param token [IN]: the expected token for the response msg
+* @return
+* 0:success
+* other:failure
+*/
+int wait_response(int sockfd,Parcel *& p,int utoken)
+{
+ int len = 0;
+ int flag = 1;
+ int count = 0;
+ int in_utoken = -1;
+ int resp_type = -1;
+ Parcel *temp = NULL;
+ char recvline[LYNQ_REC_BUF];
+ //Sometimes the socket is abnormal, causing the socket buffer to store the response of the last request.
+ //Here it does not return until the response corresponding to the request is read.
+ while(flag && (count < 20))//why?
{
- p.readInt32(resp_type);
- p.readInt32(request);
- p.readInt32(slot_id);
- p.readInt32(error);
+ bzero(recvline,LYNQ_REC_BUF);
+ count++;
+ LYINFLOG("wait_response,count:%d",count);
+ len = recvfrom(sockfd,recvline,LYNQ_REC_BUF,0,(struct sockaddr *)&lynq_data_socket_server_addr,(socklen_t *)&lynq_data_socket_server_addr_len);
+ if(len == -1)
+ {
+ LYERRLOG("wait_response fail,errno:%d",errno);
+ return LYNQ_E_GET_RESP_FAIL;
+ }
+ if (len != 0)
+ {
+ temp = new Parcel;
+ int i = 0;
+ while((NULL == temp) && (i < 100))
+ {
+ usleep(1000);
+ temp = new Parcel;
+ i++;
+ }
+ if((i >= 100) || (NULL == temp))
+ {
+ LYERRLOG("wait_response i:%d",i);
+ return LYNQ_E_GET_RESP_FAIL;
+ }
+ temp->setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
+ temp->setDataPosition(0);
+ temp->readInt32(&resp_type);
+ temp->readInt32(&in_utoken);
+ LYINFLOG("[%s]in_utoken:%d,utoken:%d",__FUNCTION__,in_utoken,utoken);
+ if (in_utoken != utoken)
+ {
+ delete temp;
+ temp = NULL;
+ in_utoken = 0;
+ continue;
+ }
+ temp->setDataPosition(0);
+ p = temp;
+ flag = 0;
+ return 0;
+ }
+ else
+ {
+ LYERRLOG("recvline is null,errno:%d",errno);
+ return LYNQ_E_GET_RESP_FAIL;
+ }
+ }
+ return LYNQ_E_GET_RESP_FAIL;
+}
+
+int JumpHeader(Parcel *p,int *resp_type,int *utoken,int *request,int *slot_id,int *error)
+{
+ if(NULL == p)
+ {
+ LYERRLOG("JumpHeader is null");
+ return -1;
+ }
+ if(p->dataAvail() > 0)
+ {
+ p->readInt32(resp_type);
+ p->readInt32(utoken);
+ p->readInt32(request);
+ p->readInt32(slot_id);
+ p->readInt32(error);
return 0;
}
else
@@ -341,6 +458,14 @@
return -1;
}
}
+void free_parcel(Parcel *p)
+{
+ if(p)
+ {
+ delete p;
+ p = NULL;
+ }
+}
int send_request(int sockfd,lynq_client_t *client_tmp)
{
int ret=0;
@@ -589,6 +714,7 @@
pthread_mutex_lock(&s_lynq_urc_vector_mutex);
s_data_urc_wait_list.push_back(apnId);
pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+ sendSignalDeactvied();
sendSignalPdnChange();
printf_apn_table_debug(__FUNCTION__,__LINE__);
}
@@ -657,7 +783,7 @@
pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
return 0;
}
-
+int get_imsi();
int lynq_init_data(int uToken)
{
if (g_lynq_data_init_flag == 1)
@@ -691,6 +817,23 @@
return -1;
}
memset(lynq_apn_table,0,sizeof(lynq_apn_table));
+ int count = 0;
+ while(count < 10)
+ {
+ result = get_imsi();
+ if(result==0)
+ {
+ break;
+ }
+ sleep(1);
+ count++;
+ }
+ LYINFLOG("[%s] count is %d",__FUNCTION__,count);
+ if(result!=0)
+ {
+ LYDBGLOG("lynq init call fail!!!");
+ return LYNQ_E_MD_NOT_READY;//
+ }
LYDBGLOG("lynq init call success!!!");
return 0;
@@ -733,7 +876,7 @@
LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
error = lynq_setup_data_call_sp(handle,NULL,"iot_default",NULL,NULL,NULL,NULL,NULL);
#else
- Parcel p;
+ Parcel *p = NULL;
lynq_client_t client;
int resp_type = -1;
int request = -1;
@@ -744,7 +887,7 @@
LYERRLOG("handle is null!!!");
return LYNQ_E_NULL_ANONALY;
}
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
@@ -763,11 +906,21 @@
{
LYERRLOG("send request fail");
perror("[LYNQ_DATA] send request fail:");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return LYNQ_E_NULL_ANONALY+2;
}
- get_response(lynq_client_sockfd,p);
+ //get_response(lynq_client_sockfd,p);
+ error = wait_response(lynq_client_sockfd,p,client.uToken);
+ if(error!=0)
+ {
+ LYERRLOG("wait_response fail,ret:%d",error);
+ printf_apn_table_debug(__FUNCTION__,__LINE__);
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
+ return error;
+ }
pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
JumpHeader(p,&resp_type,&request,&slot_id,&error);
+ free_parcel(p);
LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
if(error==0)
{
@@ -794,7 +947,7 @@
int lynq_deactive_data_call(int *handle)
{
- Parcel p;
+ Parcel *p = NULL;
lynq_client_t client;
int resp_type = -1;
int request = -1;
@@ -814,7 +967,7 @@
return -1;
}
lynq_data_call_id = *handle;
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
@@ -834,19 +987,38 @@
{
LYERRLOG("send request fail");
perror("[LYNQ_DATA] send request fail:");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return -1;
}
- get_response(lynq_client_sockfd,p);
+ //get_response(lynq_client_sockfd,p);
+ error = wait_response(lynq_client_sockfd,p,client.uToken);
+ if(error!=0)
+ {
+ LYERRLOG("wait_response fail,ret:%d",error);
+ printf_apn_table_debug(__FUNCTION__,__LINE__);
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
+ return error;
+ }
pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
- JumpHeader(p,&resp_type,&request,&slot_id,&error);
- LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
+ JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
+ LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
cleanOnceApnTable(lynq_data_call_id);
printf_apn_table_debug(__FUNCTION__,__LINE__);
+ if(error==0)
+ {
+ if(waitDeactived(20000)==ETIMEDOUT)
+ {
+ error = LYNQ_E_TIME_OUT;
+ LYERRLOG("[lynq_deactive_data_call] timeout:wait data Call state fail!!!");
+ printf_apn_table_debug(__FUNCTION__,__LINE__);
+ }
+ }
+ free_parcel(p);
return error;
}
int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)
{
- Parcel p;
+ Parcel *p = NULL;
lynq_client_t client;
int resp_type = -1;
int request = -1;
@@ -908,7 +1080,7 @@
{
argv[5] = roamingProtocol;
}
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
client.paramLen = 7;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
@@ -938,12 +1110,22 @@
{
LYERRLOG("send request fail");
perror("[LYNQ_DATA] send request fail:");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return LYNQ_E_NULL_ANONALY+2;
}
- get_response(lynq_client_sockfd,p);
+ //get_response(lynq_client_sockfd,p);
+ error = wait_response(lynq_client_sockfd,p,client.uToken);
+ if(error!=0)
+ {
+ LYERRLOG("wait_response fail,ret:%d",error);
+ printf_apn_table_debug(__FUNCTION__,__LINE__);
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
+ return error;
+ }
pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
- JumpHeader(p,&resp_type,&request,&slot_id,&error);
- LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
+ JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
+ LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
+ free_parcel(p);
if(error==0)
{
data_timelimit = 1;
@@ -999,11 +1181,11 @@
*/
int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)
{
- Parcel p;
+ Parcel *p = NULL;
lynq_client_t client;
int resp_type = -1;
int token;
- int request = -1;
+ int request = -1;
int slot_id = -1;
int error = -1;
int version =0;
@@ -1014,8 +1196,7 @@
LYERRLOG("dataCallList is null!!!");
return -1;
}
- Global_uToken++;
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();;
client.request = 57;//RIL_REQUEST_DATA_CALL_LIST
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
@@ -1025,79 +1206,81 @@
{
LYERRLOG("send request fail");
perror("[LYNQ_DATA] send request fail:");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return -1;
}
- get_response(lynq_client_sockfd,p);
+ //get_response(lynq_client_sockfd,p);
+ error = wait_response(lynq_client_sockfd,p,client.uToken);
+ if(error!=0)
+ {
+ LYERRLOG("wait_response fail,ret:%d",error);
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
+ return error;
+ }
pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
- if(p.dataAvail() > 0)
+ if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
{
- p.readInt32(&resp_type);
- p.readInt32(&token);
- p.readInt32(&request);
- p.readInt32(&slot_id);
- p.readInt32(&error);
- }
- else
- {
+ LYERRLOG("JumpHeader fail");
return -1;
}
- LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,token,request,slot_id,error);
- p.readInt32(&version);
+ LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
+ p->readInt32(&version);
if(version==11)
{
- p.readInt32(&num);
+ p->readInt32(&num);
*realNum = num;
for (int i = 0; i < num; i++)
{
- p.readInt32(&dataCallList[i].status);
- p.readInt32(&dataCallList[i].suggestedRetryTime);
- p.readInt32(&dataCallList[i].cid);
- p.readInt32(&dataCallList[i].active);
- temp_char = strdupReadString(p);
+ p->readInt32(&dataCallList[i].status);
+ p->readInt32(&dataCallList[i].suggestedRetryTime);
+ p->readInt32(&dataCallList[i].cid);
+ p->readInt32(&dataCallList[i].active);
+ temp_char = strdupReadString_p(p);
LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
if(temp_char)
{
memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);
free(temp_char);
}
- temp_char = strdupReadString(p);
+ temp_char = strdupReadString_p(p);
LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
if(temp_char)
{
memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);
free(temp_char);
}
- temp_char = strdupReadString(p);
+ temp_char = strdupReadString_p(p);
LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
if(temp_char)
{
memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);
free(temp_char);
}
- temp_char = strdupReadString(p);
+ temp_char = strdupReadString_p(p);
LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
if(temp_char)
{
memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);
free(temp_char);
}
- temp_char = strdupReadString(p);
+ temp_char = strdupReadString_p(p);
LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
if(temp_char)
{
memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);
free(temp_char);
}
- temp_char = strdupReadString(p);
+ temp_char = strdupReadString_p(p);
LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
if(temp_char)
{
memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);
free(temp_char);
}
- p.readInt32(&dataCallList[i].mtu);
+ p->readInt32(&dataCallList[i].mtu);
}
}
+ free_parcel(p);
return error;
}
@@ -1470,7 +1653,7 @@
}
int get_imsi()
{
- Parcel p;
+ Parcel *p =NULL;
lynq_client_t client;
int resp_type = -1;
int token;
@@ -1482,7 +1665,7 @@
char *temp_char = NULL;
char mccmnc[32] = {0};
char mccmnckey[64] = {0};
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 11;//RIL_REQUEST_GET_IMSI 11
client.paramLen = 0;
bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
@@ -1492,33 +1675,36 @@
{
LYERRLOG("send request fail");
perror("[LYNQ_DATA] send request fail:");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return -1;
}
- get_response(lynq_client_sockfd,p);
- pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
- if(p.dataAvail() > 0)
+ //get_response(lynq_client_sockfd,p);
+ error = wait_response(lynq_client_sockfd,p,client.uToken);
+ if(error!=0)
{
- p.readInt32(&resp_type);
- p.readInt32(&token);
- p.readInt32(&request);
- p.readInt32(&slot_id);
- p.readInt32(&error);
- LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,token,request,slot_id,error);
- if(!error)
- {
- char * test = lynqStrdupReadString(p);
- memcpy(mccmnc, test,5);
- mccmnc[5]='\0';
- free(test);
- sprintf(mccmnckey,"uci set radio_property.property.vendor_ril_data_gsm_mcc_mnc0=%s",mccmnc);
- system(mccmnckey);
- }
+ LYERRLOG("wait_response fail,ret:%d",error);
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return error;
}
- else
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
+ if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
{
+ LYERRLOG("JumpHeader fail");
return -1;
}
+ LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
+ if(error == 0)
+ {
+ char * test = strdupReadString_p(p);
+ memcpy(mccmnc, test,5);
+ mccmnc[5]='\0';
+ free(test);
+ sprintf(mccmnckey,"uci set radio_property.property.vendor_ril_data_gsm_mcc_mnc0=%s",mccmnc);
+ system(mccmnckey);
+ system("uci commit");
+ }
+ free_parcel(p);
+ return error;
}
int lynq_modify_apn_db(const int cmd, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier, char *out)
{
@@ -1542,12 +1728,10 @@
count++;
}
LYINFLOG("[%s] count is %d",__FUNCTION__,count);
- Parcel p;
if (cmd == 0) // insert apn db
{
res = insert_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
-
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
client.paramLen = 2;
bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
@@ -1560,7 +1744,7 @@
LYERRLOG("id is NULL!!!please input id: ");
}
sprintf(argc, "id=%s", id);
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
client.paramLen = 2;
bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
@@ -1569,7 +1753,7 @@
else if (cmd == 2) //query apn db
{
query_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
client.paramLen = 2;
bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
@@ -1578,7 +1762,7 @@
else if (cmd == 3) //modify apn db
{
modify_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
client.paramLen = 2;
bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
@@ -1591,11 +1775,10 @@
}
LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
pthread_mutex_lock(&g_lynq_data_sendto_mutex);
- LYINFLOG("[%s] wait 4s",__FUNCTION__);
- sleep(4);
if(send_request(lynq_client_sockfd,&client)==-1)
{
LYERRLOG("send request fail");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return -1;
}
pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
@@ -1607,13 +1790,12 @@
int lynq_reset_apn(char *result)
{
- Parcel p;
lynq_client_t client;
if (NULL == result)
{
LYERRLOG("incoming paramters error");
}
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
client.request = 2000 + 194;
client.paramLen = 0;
bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
@@ -1622,6 +1804,7 @@
if (send_request(lynq_client_sockfd, &client) == -1)
{
LYERRLOG("send request fail");
+ pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
return -1;
}
pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
diff --git a/src/lynq/lib/liblynq-data/lynq_data_urc.cpp b/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
index f5d127a..c3d95c6 100755
--- a/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
@@ -77,7 +77,6 @@
{
bzero(urc_data,LYNQ_REC_BUF);
res = recvfrom(lynq_urc_sockfd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&urc_local_addr,(socklen_t*)&lynq_len_urc_addr_serv);
- LYINFLOG("[%s][%d] res:%d",__FUNCTION__,__LINE__,res);
if(res<sizeof(int32_t)*2)
{
LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
old mode 100644
new mode 100755
index 17802d4..afb93ef
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
@@ -6474,12 +6474,12 @@
RLOGD("RIL_client_register create socket clientSocketName %s", clientSocketName);
+ s_fdCommand_client[i] = -1;
if (createClientSocket(clientSocketName, i) < 0) {
RLOGE("create client failed");
return;
}
- s_fdCommand_client[i] = -1;
}
}
}
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp
index bbb8790..8222aaf 100755
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp
@@ -75,6 +75,7 @@
int RpDataController::s_dataSetting_resend[MAX_SIM_COUNT][DATA_SETTING_NUMBERS];
RpDataController* RpDataController::sInstance[4] = {NULL};
+Mutex m_mutex[MAX_SIM_COUNT];
#include <string>
using namespace std;
@@ -497,7 +498,7 @@
RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL dataController", __FUNCTION__, __LINE__ ,sim_ps_id);
return;
}
-
+ m_mutex[sim_ps_id - 1].lock();
RmcDcPdnManager* pPdnManager = dataController->m_pPdnManager;
if (pPdnManager == NULL){
@@ -515,6 +516,7 @@
dataController->sendDataCallListResponse(result_ptr->id);
pPdnManager->clearPdnInfo(result_ptr->id);
}
+ m_mutex[sim_ps_id - 1].unlock();
}
@@ -705,7 +707,7 @@
RFX_ASSERT(m_pPdnManager != NULL);
}
}
- RFX_LOG_D(RFX_LOG_TAG, "%s %d m_pPdnManager[%p]", __FUNCTION__, __LINE__, m_pPdnManager);
+ //RFX_LOG_D(RFX_LOG_TAG, "%s %d m_pPdnManager[%p]", __FUNCTION__, __LINE__, m_pPdnManager);
return m_pPdnManager ;
}
@@ -1381,7 +1383,7 @@
goto error;
}
-
+ m_mutex[rid].lock();
for (int i = 0; i < nPdnInfoSize; i++) {
if ((getPdnManager()->getPdnActiveStatus(i) == DATA_STATE_ACTIVE) &&
(getPdnManager()->getTransIntfId(i) != INVALID_TRANS_INTF_ID) &&
@@ -1390,7 +1392,7 @@
vTransIntfIdList.push_back(getPdnManager()->getTransIntfId(i));
}
}
-
+ m_mutex[rid].unlock();
if (vTransIntfIdList.size() > 0) {
RFX_LOG_D(RFX_LOG_TAG, "[%d][%s] active trans-interface number is %zu",
rid, __FUNCTION__, vTransIntfIdList.size());
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h
index 88d6d22..4a1fc60 100755
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h
@@ -48,6 +48,10 @@
#include <utils/Vector.h>
+#include "utils/Mutex.h"
+
+using ::android::Mutex;
+
#define DATA_SETTING_NUMBERS 5
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RtcCapabilitySwitchChecker.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RtcCapabilitySwitchChecker.cpp
index aebf3d3..c777f10 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RtcCapabilitySwitchChecker.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RtcCapabilitySwitchChecker.cpp
@@ -215,7 +215,9 @@
#endif
bool RtcCapabilitySwitchChecker::imsiReady(bool log) {
- for (int i = RFX_SLOT_ID_0; i < getSimCount(); i++) {
+ int card_type = 0;
+
+ for (int i = RFX_SLOT_ID_0; i < getSimCount(); i++) {
/*TODO
int sim_state = m_status_managers[i]->getIntValue(RFX_STATUS_KEY_SIM_STATE);
int sim_onoff_state = getSimOnOffState(i, log);
@@ -228,6 +230,12 @@
continue;
}
*/
+ card_type = m_status_managers[i]->getIntValue(RFX_STATUS_KEY_CARD_TYPE, 0);
+ if (card_type <= 0) {
+ RFX_LOG_I(RFX_LOG_TAG, "imsiReady, skip when sim%d_state=%d", i + 1, card_type);
+ continue;
+ }
+
const String8& imsi = getImsi(i);
if (imsi.isEmpty()) {
RFX_LOG_I(RFX_LOG_TAG, "imsiReady, sim%d imsi not ready", i + 1);