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