Merge "[Bugfix][API-1099]occasionally,setup data call fail,due to tele-fwk can not get mccmnc <new solution>" into GSW3.0-No-Connman
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 67e112d..70f6daa 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -782,6 +782,8 @@
     return 0;
 }
 int get_imsi();
+int check_apn_status();
+int radio_switch(int status);
 int lynq_init_data(int uToken)
 {
     if (g_lynq_data_init_flag == 1)
@@ -815,7 +817,28 @@
         return -1;
     }
     memset(lynq_apn_table,0,sizeof(lynq_apn_table));
+    LYINFLOG("[%s] radio on/off solution 20230724",__FUNCTION__);
     int count = 0;
+    while(count < 2)//try recover the network within 10s.
+    {
+        result =  check_apn_status();
+        if(result==0)
+        {
+            break;
+        }
+        radio_switch(0);
+        sleep(1);
+        radio_switch(1);
+        sleep(3);
+        count++;
+    }
+    LYINFLOG("[%s] count is %d",__FUNCTION__,count);
+    if(result!=0)
+    {
+        LYDBGLOG("lynq init call fail!!!");
+        return LYNQ_E_MD_NOT_READY;//
+    }
+    /* old
     while(count < 10)
     {
         result =  get_imsi();
@@ -832,6 +855,7 @@
         LYDBGLOG("lynq init call fail!!!");
         return LYNQ_E_MD_NOT_READY;//
     }
+    */
     LYDBGLOG("lynq init call success!!!");
     return 0;
 
@@ -1813,3 +1837,96 @@
 }
 
 /*Typethree add for T800 platform 2022/04/21 end*/
+static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
+    FILE *fp;
+    //printf("to exec cmd:%s\n", str_cmd);
+    if((fp=popen(str_cmd,"r"))==NULL)
+    {
+        perror("popen error!");
+        return -1;
+    }
+    if((fread(str_cmd_ret,max_len,1,fp))<0)
+    {
+        perror("fread fail!");
+        fclose(fp);
+        return -1;
+    }
+    fclose(fp);
+    return 0;
+}
+int check_apn_status()
+{
+    LYINFLOG("check_apn_status enter");
+    int ret = -1;
+    char cmd_ret[8] ={0};//get mccmnc
+    const char *cmd = "uci get radio_property.property.vendor_ril_data_gsm_mcc_mnc0";
+    const char *empty_str = ":empty";
+    ret = exec_cmd(cmd,cmd_ret,8);
+    if(ret==0)
+    {
+        if(strlen(cmd_ret)==0)
+        {
+            LYERRLOG("not have mccmnc config in uci ram");
+            return 1;
+        }
+        if(strncmp(cmd_ret,empty_str,strlen(empty_str))==0)
+        {
+            LYERRLOG("mccmnc is empty");
+            return 2;
+        }
+        LYINFLOG("mccmnc is %s",cmd_ret);
+        return 0;
+    }
+    else
+    {
+        LYERRLOG("exec cmd fail");
+        return -1;
+    }
+    return 0;
+}
+int radio_switch(int status)
+{
+    Parcel *p =NULL;
+    lynq_client_t client;
+    int resp_type = -1;
+    int token;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    int version =0;
+    int num = 0;
+    char *temp_char = NULL;
+    char mccmnc[32] = {0};
+    char mccmnckey[64] = {0};
+    client.uToken = get_utoken();
+    client.request = 59;//RIL_REQUEST_OEM_HOOK_RAW 59
+    client.paramLen = 1;
+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
+    sprintf(client.param,"AT+CFUN=%d",status);
+    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);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        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);
+    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(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);
+    free_parcel(p);
+    return error;
+}
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
index afb93ef..49704a1 100755
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
@@ -6663,6 +6663,8 @@
 
     for (int i = 0; i < RIL_SOCKET_NUM; i++) {
         pthread_mutex_init(&s_state_mutex[i], NULL);
+        pthread_mutex_init(&s_pendingUrcMutex[i], NULL);
+        s_fdCommand[i] = -1;
     }
 
     // New rild impl calls RIL_startEventLoop() first
@@ -6691,10 +6693,10 @@
     }
 
     // initialize mutex
-    for (int i = 0; i < RIL_SOCKET_NUM; i++) {
-        pthread_mutex_init(&s_pendingUrcMutex[i], NULL);
-        s_fdCommand[i] = -1;
-    }
+    //for (int i = 0; i < RIL_SOCKET_NUM; i++) {
+    //    pthread_mutex_init(&s_pendingUrcMutex[i], NULL);
+    //    s_fdCommand[i] = -1;
+    //}
     /// @}
     RILJ_register();
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
index 920ba2d..e5ed57e 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
@@ -332,14 +332,15 @@
         RpApnController *apnController = (RpApnController *)findController(i,
                                     RFX_OBJ_CLASS_INFO(RpApnController));
 
-        char mccmncvalue[32]={0};
+/*        char mccmncvalue[32]={0};
         String8 mccMncKey("");
         mccMncKey.append("vendor.ril.data.gsm_mcc_mnc");
-        mccMncKey.append(String8::format("%d", m_slot_id));
+        mccMncKey.append(String8::format("%d", i));
         property_get(mccMncKey, mccmncvalue,"");
-        getStatusManager()->setString8Value(RFX_STATUS_KEY_GSM_OPERATOR_NUMERIC, String8(mccmncvalue));
+        getStatusManager(i)->setString8Value(RFX_STATUS_KEY_GSM_OPERATOR_NUMERIC, String8(mccmncvalue));
         logD(RFX_LOG_TAG, "[reloadApnDB]mccmnc: %s",mccmncvalue);
         mccmnc = getStatusManager(i)->getString8Value(RFX_STATUS_KEY_GSM_OPERATOR_NUMERIC, String8(""));
+*/
         if (!mccmnc.isEmpty()) {
             logD(RFX_LOG_TAG, "[reloadApnDB]start: %d, dataController->getApnReady() =%d", i, dataController->getApnReady());
             int count = 0;
@@ -845,7 +846,7 @@
 #endif
     //notify datacontroller
     apnController->apn_ready_singal.postEmit();
-
+    RLOGD("RpApnController::ApnInitThread::threadLoop done!!!");
     return false;
 }
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp
index 63443ad..340d0aa 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp
@@ -231,7 +231,7 @@
 void RpDataController::handleSetupDataRequest(const sp<RfxMessage>& request) {
     logD(RFX_LOG_TAG, "handleSetupDataRequest with clientId: %d, with token: %d",
             request->getClientId(), request->getToken());
-    checkMccMnc();
+    //checkMccMnc();
     if (request->getClientId() > 0) {
         RpDataController::mDcTracker.requestNetwork(request);
     } else {