[Feature][T800][task-view-2029][RIL] support switch SIM slot function
and APIs

Only Configure:No
Affected branch:ZK-first-oem-release
Affected module:RIL
Is it affected on:only mtk
Self-test:Yes
Doc Update: No

Change-Id: I618679f0d13a09cd3dba022254184db7e0d8aa14
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb
index fad21ae..0077bfa 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb
@@ -1,9 +1,9 @@
 inherit externalsrc package
 
-DESCRIPTION = "liblynq-uci.so demo"
+DESCRIPTION = "liblynq-sim.so"
 LICENSE = "CLOSED"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
-DEPENDS += "platform-libs platform-libs-common libpal liblynq-log libvendor-ril"
+DEPENDS += "platform-libs platform-libs-common libpal liblynq-log libvendor-ril lynq-ril-service"
 inherit workonsrc
 WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/common_src/lib/liblynq-sim/"
 
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
index fafc153..f4d0133 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
@@ -44,7 +44,8 @@
 		install -d ${D}${systemd_unitdir}/system/
 		install -m 0644 ${B}/lynq_ril_service.service ${D}${systemd_unitdir}/system
 	fi
-#	install -d ${D}${includedir}
+	install -d ${D}${includedir}/lynq-ril
+	install ${S}/lynq_interface.h ${D}${includedir}/lynq-ril
 #	install ${S}/atci/ATCI.h ${D}${includedir}
 #	cp -R ${S}/demoscript ${D}${bindir}/
 	if test "${TARGET_PLATFORM}" = "mt2731"; then
diff --git a/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c b/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c
index 24db98c..9de6e50 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c
+++ b/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c
@@ -165,7 +165,7 @@
     char *atcicmd_req_ptr, *atcmd_res_ptr, *atci_res;
     uint16_t atcmd_req_len, atcmd_res_len;
 
-    char simIDProperty[MTK_PROPERTY_VALUE_MAX];
+    char simIDProperty[MTK_PROPERTY_VALUE_MAX] = {0};
     int simID = 0;
 
     int char_sub = 0x1a;
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h
index 115e16d..44cf5ce 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h
@@ -251,14 +251,14 @@
  
 #ifdef MODE_DSDS
     {"SET_DEFAULT_SIM_ALL",set_default_sim_all, "set default sim_all", -1},
-    {"GET_DEFAULT_SIM_ALL",get_default_sim_all, "get default sim_all", -1},
+    {"GET_DEFAULT_SIM_ALL",get_default_sim_all, "get default sim_all", LYNQ_REQUEST_GET_DEFAULT_SIM_ALL},
     {"SET_DEFAULT_SIM_VOICE",set_default_sim_voice, "set default sim_voice", -1},
     {"GET_DEFAULT_SIM_VOICE",get_default_sim_voice, "get default sim_voice", -1},
     {"SET_DEFAULT_SIM_DATA",set_default_sim_data, "set default sim_data", -1},
     {"GET_DEFAULT_SIM_DATA",get_default_sim_data, "get default sim_data", -1},
     {"SET_DEFAULT_SIM_SMS",set_default_sim_sms, "set default sim_sms", -1},
     {"GET_DEFAULT_SIM_SMS",get_default_sim_sms, "get default sim_sms", -1},
-    {"SET_DEFAULT_SIM_ALL_EXCEPT_DATA",set_default_sim_all_except_data, "set default sim_all", -1},
+    {"SET_DEFAULT_SIM_ALL_EXCEPT_DATA",set_default_sim_all_except_data, "set default sim_all", LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA},
     {"GET_DEFAULT_SIM_ALL_EXCEPT_DATA",get_default_sim_all_except_data, "get default sim_all", -1},
 #endif /*MODE_DSSS*/
     {"GET_MAIN_SIM_CARD",get_main_sim_card, "get main sim card", -1},
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp
index b87b051..a77505a 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp
@@ -39,6 +39,7 @@
 #include "cc.h"
 #include "include/lynq_systime.h"
 #include <include/lynq_uci.h>
+#include "lynq_interface.h"
 #ifdef LED_SUPPORT
 #include "led.h"
 #endif
@@ -422,6 +423,19 @@
             Radio_capability_switch_util::sendRadioCapabilityRequest(slot);
         }
     }
+    //#ifdef LYNQ_DSDS_MODE
+    else
+    {
+        RLOGD("[%s][%d]Already in required sim%d",__FUNCTION__,__LINE__,slot);
+        usleep(500*1000);
+        android::Parcel allow_data_p;
+        allow_data_p.writeInt32 (1);
+        allow_data_p.writeInt32 (LYNQ_URC_ALLOW_DATA);
+        allow_data_p.writeInt32 (slot);
+        allow_data_p.writeInt32 (0);
+        android::LYNQ_RIL_urcBroadcast(allow_data_p,LYNQ_URC_ALLOW_DATA);
+    }
+    //#endif
     pthread_mutex_unlock(&s_DataMutex);
 }
 
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h
index a7f2a6b..3872b91 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h
@@ -54,8 +54,8 @@
 
 
 #define DEBUG 0
-#define FUNCTION_CALLED(time,msg) printf("%s: %s %s called\n",(time), __func__ ,(msg));
-#define FUNCTION_RETURN(time,msg) printf("%s: %s %s returns\n",(time), __func__ ,(msg));
+#define FUNCTION_CALLED(time,msg) RLOGD("%s: %s %s called\n",(time), __func__ ,(msg));
+#define FUNCTION_RETURN(time,msg) RLOGD("%s: %s %s returns\n",(time), __func__ ,(msg));
 
 #define EM_MODE_SUPPORT 1
 #ifdef ATCI_PARSE
@@ -91,25 +91,6 @@
 **The range of error values unique to LYNQ is 8000 to 10000.
 **The sim card state is error.
 */
-typedef enum{
-    LYNQ_E_CARDSTATE_ERROR=8000,
-    /* The voice service state is out of service*/
-    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
-    /* The voice service state is EMERGENCY_ONLY*/
-    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
-    /* The radio power is power off*/
-    LYNQ_E_STATE_POWER_OFF=8003,
-    LYNQ_E_TIME_OUT=8004,
-    /*create or open sms DB fail */
-    LYNQ_E_SMS_DB_FAIL=8005,
-    /*Failed to execute sql statement*/
-    LYNQ_E_SMS_SQL_FAIL = 8006,
-    LYNQ_E_SMS_NOT_FIND = 8007,
-    /* The logic conflict*/
-    LYNQ_E_CONFLICT=9000,
-    /*Null anomaly*/
-    LYNQ_E_NULL_ANONALY=9001
-}LYNQ_E;
 /*Warren add for t800 RIL Service 2021/12/10 start*/
 
 typedef struct{
@@ -273,6 +254,7 @@
     void registerForNetworkInfo(netwokInfoNotify cb);
     void unregisterATcmd();
     int emResultNotify(const char *str);
+    int lynq_emResultNotify(Parcel &p);
     void ATCIRequest(int request, char* reqString, void* t,int argc, char**argv);
     void startWakupLoop(void);
     /*Warren add for FAW platform 2021/9/27 start*/
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h
index 401b9bd..f8cdf47 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h
@@ -13,6 +13,7 @@
 #define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
 #define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
 
+#define LYNQ_URC_ALLOW_DATA (LYNQ_URC_VENDOR_BASE + 10)
 
 #define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)
 #define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)
@@ -39,6 +40,8 @@
 #define LYNQ_REQUEST_GET_RTP_PARAM (LYNQ_REQUEST_VENDOR_BASE + 25)
 #define LYNQ_REQUEST_SET_CALL_RTP_SSRC (LYNQ_REQUEST_VENDOR_BASE + 26)
 #define LYNQ_REQUEST_GET_CALL_RTP_SSRC (LYNQ_REQUEST_VENDOR_BASE + 27)
+#define LYNQ_REQUEST_GET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 28)
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA (LYNQ_REQUEST_VENDOR_BASE + 29)
 
 #ifdef ECALL_SUPPORT
 #define RIL_UNSOL_ECALL_T2_TIMER_OUT  9000
@@ -49,6 +52,44 @@
 #define RIL_UNSOL_ECALL_AUTO_ANS_TIMER_OUT 9005
 #define RIL_UNSOL_ECALL_AUTO_ANS_IMS_TIMER_OUT 9006
 #endif
+//Warren add for plantform 2024_04_11 start
+/* 
+**The range of error values unique to LYNQ is 7000 to 10000.
+**The sim card state is error.
+*/
+typedef enum{
+    /*base abnormal*/
+    LYNQ_E_PARAMETER_ANONALY=7000,
+    LYNQ_E_SEND_REQUEST_FAIL=7001,
+    LYNQ_E_GET_HEAD_ERROR=7002,
+    LYNQ_E_INNER_ERROR=7100,
+    LYNQ_E_MALLOC_ERROR=7101,
+    /**/
+    LYNQ_E_CARDSTATE_ERROR=8000,
+    /* The voice service state is out of service*/
+    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
+    /* The voice service state is EMERGENCY_ONLY*/
+    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
+    /* The radio power is power off*/
+    LYNQ_E_STATE_POWER_OFF=8003,
+    LYNQ_E_TIME_OUT=8004,
+    /*create or open sms DB fail */
+    LYNQ_E_SMS_DB_FAIL=8005,
+    /*Failed to execute sql statement*/
+    LYNQ_E_SMS_SQL_FAIL = 8006,
+    LYNQ_E_SMS_NOT_FIND = 8007,
+    /* The logic conflict*/
+    LYNQ_E_CONFLICT=9000,
+    /*Null anomaly*/
+    LYNQ_E_NULL_ANONALY=9001,
+    /*Invalid id anomaly*/
+    LYNQ_E_INVALID_ID_ANONALY=9002,
+#ifdef ECALL_SUPPORT
+    LYNQ_E_ECALL_BEING_RUNNING =9003,
+    LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
+    LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
+#endif
+}LYNQ_E;
 
 typedef struct{
     int request;
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp
index 90a842a..a81dd7c 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp
@@ -137,6 +137,8 @@
 int enable_bt_resp = 0;
 int wakeup_token = -1;
 struct sockaddr_in client_addr;
+struct sockaddr_in lynq_client_addr;
+
 
 #define ANDROID_WAKE_LOCK_NAME "radio-interface"
 
@@ -4517,6 +4519,15 @@
                 sleep(WAIT_TIME_FOR_SIM_SWITCH);
                 setupDataCall(0, NULL, (RIL_SOCKET_ID)0, NULL);
             }
+            if(utils::is_support_dsds() && get_default_sim_data() == socket_id)
+            {
+                Parcel allow_data_p;
+                allow_data_p.writeInt32 (1);
+                allow_data_p.writeInt32 (LYNQ_URC_ALLOW_DATA);
+                allow_data_p.writeInt32 (socket_id);
+                allow_data_p.writeInt32 (e);
+                LYNQ_RIL_urcBroadcast(allow_data_p,LYNQ_URC_ALLOW_DATA);
+            }
             break;
         }
 #ifdef KEEP_ALIVE
@@ -5293,6 +5304,8 @@
         case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
         case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
         case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_GET_DEFAULT_SIM_ALL:return "GET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA:return "SET_DEFAULT_SIM_ALL_EXCEPT_DATA";
         case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
         case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
 		case LYNQ_REQUEST_SET_VOICE_AUDIO_MODE:return "LYNQ_REQUEST_SET_VOICE_AUDIO_MODE";
@@ -5574,6 +5587,8 @@
         case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
         case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
         case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_GET_DEFAULT_SIM_ALL:return "GET_DEFAULT_SIM_ALL";
+        case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA:return "SET_DEFAULT_SIM_ALL_EXCEPT_DATA";
         case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
         case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
         case RIL_UNSOL_TELEPHONY_RESTART:return "RIL_UNSOL_TELEPHONY_RESTART";/*xy.he add for t800 ril service 2023/10/23*/
@@ -6111,6 +6126,8 @@
     RLOGD("LYNQ_RIL_RecSocket start\n");
     char *argv[MAX_ARGS];
     int argc = 0;
+    int ril_slot_status = 0;
+    int ril_slot = 0;
     int ep_fd = 0;
     int en_fd = 0;
     struct epoll_event lynq_ev;
@@ -6187,6 +6204,9 @@
                 while(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) != -1)//add while by hq for bug 760 2023/02/09
                 {
                     client_tmp = (lynq_client_t*)buffer;
+                    lynq_client_addr = lynqClient_addr;
+                    ril_slot_status = (int)(buffer+(1024*8+sizeof(int)*3))[0] - '0';
+                    ril_slot = (int)(buffer+(1024*8+sizeof(int)*3)+1)[0] - '0';
                     RLOGD("[LYNQ socketId] utoken=%d,request=%d,len=%d,param=%s",client_tmp->uToken,client_tmp->request,client_tmp->paramLen,client_tmp->param);
                     //char test[36] = {};
                     //sprintf(test,"test okay len = %d",client_tmp->paramLen);
@@ -6218,10 +6238,17 @@
                     int32_t request;
                     request = command->request;
                     RIL_SOCKET_ID id = RIL_SOCKET_1;
-                    if(utils::is_support_dsds()) {
-                        id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
-                    } else if(utils::is_suppport_dsss()) {
-                        id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+                    if((ril_slot_status == 1) && ((ril_slot == 0) | (ril_slot == 1)))
+                    {
+                        id = (RIL_SOCKET_ID)ril_slot;
+                    }
+                    else
+                    {
+                        if(utils::is_support_dsds()) {
+                            id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
+                        } else if(utils::is_suppport_dsss()) {
+                            id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+                        }
                     }
                     if(request == -1)
                     {
@@ -7502,6 +7529,19 @@
     return len_s;
 }
 
+int lynq_emResultNotify(Parcel &p)
+{
+
+    RLOGD("emResultNotify parcel");
+    int dataSize = p.dataSize();
+    const uint8_t* data = p.data();
+    int len_s = sendto(server_socket_fd,data,dataSize,0,(struct sockaddr *)&lynq_client_addr,sizeof(lynq_client_addr));
+    //sendto(server_socket_fd,"stopemdone",strlen("stopemdone"),0,(struct sockaddr *)&client_addr,sizeof(client_addr));
+    RLOGD("len_s = %d,errno = %d",len_s,errno);
+    return len_s;
+}
+
+
 void processUnsolicited (Parcel &p, int type)
 {
     int32_t response = -1;
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h
index 0a1ebd0..a92c350 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h
@@ -24,7 +24,6 @@
 

 #define RESULT_OK (0)

 #define RESULT_ERROR (-1)

-#define LYNQ_E_PARAMETER_ANONALY 7000

 

 typedef enum{

     Rtp_Ssrc_random = 0,     

diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp
index f1bba40..10fb3c5 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp
@@ -42,6 +42,8 @@
 #include "sim.h"
 #include  "common.h"
 #include "Radio_capability_switch_util.h"
+#include "lynq_interface.h"
+
 
 #undef LOG_TAG
 #define LOG_TAG "DEMO_SIM"
@@ -216,7 +218,18 @@
     str = "default SIM(except data): " + std::to_string(get_default_sim_all_except_data()) + "\n";
     str = str + "default data: " + std::to_string(get_default_sim_data()) + "\n";
     str = str + "main capability SIM: " + std::to_string(Radio_capability_switch_util::get_main_capability_phone_id()) + "\n";
-    android::emResultNotify(str.c_str());
+    RLOGD(str.c_str());
+    android::Parcel p;
+    p.writeInt32(1);//response_type
+    p.writeInt32(pRI->uToken);//token 
+    p.writeInt32(LYNQ_REQUEST_GET_DEFAULT_SIM_ALL);//request_id
+    p.writeInt32(slot_id);//slot_id
+    p.writeInt32(0);//error_code
+    p.writeInt32((get_default_sim_data()) + (get_default_sim_all_except_data()*2));//data
+    p.setDataPosition(0);
+    android::lynq_emResultNotify(p);
+    //android::emResultNotify(str.c_str());//LYNQ_DEL_LIU.HONG_20241126
+
     free(pRI);
     return 0;
 }
@@ -326,16 +339,27 @@
 
 //SET_DEFAULT_SIM_ALL_EXCEPT_DATA
 int set_default_sim_all_except_data(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI){
+    android::Parcel p;
+    p.writeInt32(1);//res_type
+    p.writeInt32(pRI->uToken);//token
+    p.writeInt32(LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA);//request_id
+    p.writeInt32(get_default_sim_data());
     if((argc != 2) || (!is_valid(atoi(argv[1]))))
     {
         free(pRI);
         RLOGD("the paremeters numbers isn't right , so return");
-        android::emResultNotify("Set failed.\n");
+        p.writeInt32(1);//err_code
+        p.setDataPosition(0);
+        android::lynq_emResultNotify(p);
+        //android::emResultNotify("Set failed.\n"); //LYNQ_DEL_LIU.HONG_20241126
         return -1;
     }
 
     set_default_sim_all_except_data(atoi(argv[1]));
-    android::emResultNotify("Set successful.\n");
+    p.writeInt32(0);//err_code when failed
+    p.setDataPosition(0);
+    android::lynq_emResultNotify(p);
+    //android::emResultNotify("Set successful.\n"); //LYNQ_DEL_LIU.HONG_20241126
     free(pRI);
     return 0;
 }
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
index 0d926df..14bd941 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
@@ -6,6 +6,7 @@
 #include <stdlib.h>

 #include <string.h>

 #include "common.h"

+#include "lynq_interface.h"

 sms_manager * g_smsManagement;

 int sms_indexs[LYNQ_MAX_SMS_LIST]={0};

 int next_index = 0;

diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h
index c2d7793..a3860f5 100755
--- a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h
@@ -84,7 +84,38 @@
  * 
  */
 int lynq_factory_radio_state(int num);
+/**
+ * @brief set default sim card
+ * @param slot: type [IN] <slot> sim card slot
+ * @return int
+ * 0:success
+ * other:fail
+ */
+int lynq_set_default_sim(const int slot);
 
+/**
+ * @brief get default sim card
+ * @param bitslot: sim card infomation
+ * 00£¨0£©all in sim0
+ * 01£¨1£©others sim0£¬data in sim1
+ * 10£¨2£©others sim1£¬data in sim0
+ * 11£¨3£©all in sim1
+ * @return int
+ * 0:success
+ * other:fail
+ */
+
+int lynq_get_default_sim_all(int *bit_slot);
+
+/**
+ * @brief set sim card except_data
+ * @param slot: type [IN] <slot> sim card slot
+ * @return int
+ * 0:success
+ * other:fail
+ */
+
+int lynq_set_default_sim_except_data(const int slot);
 
 #ifdef __cplusplus
 }
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile
index f34e6b0..25758ec 100755
--- a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile
@@ -45,6 +45,7 @@
   -I$(ROOT)$(includedir)/vendor-ril \
   -I$(ROOT)$(includedir)/logger \
   -I$(ROOT)$(includedir)/liblog \
+  -I$(ROOT)$(includedir)/lynq-ril \
 
 
 LOCAL_LIBS := \
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp
index c780859..f61d61e 100755
--- a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp
@@ -24,6 +24,10 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include "lynq_sim.h"
+#include "liblog/lynq_deflog.h"
+#include "lynq_sim_urc.h"
+
+using ::android::Parcel;
 #define MAX_BUF 20
 #define MAX_NUM 80
 #define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
@@ -31,11 +35,17 @@
 #define LYNQ_REQUEST_CHANGE_RADIO 8015
 #define MAX_LEN 1024*8
 #define MAX_NUM 10
-#define LOG_TAG "LYNQ_SIM"
+#define USER_LOG_TAG "LYNQ_SIM"
 #define FLAG_TESS 0
-using ::android::Parcel;
 #define DEST_PORT 8088
 #define DSET_IP_ADDRESS  "127.0.0.1"
+#define SIM_ALLOW_DATA_TIMEOUT 60*1000
+#define RESULT_OK (0)
+#define RESULT_ERROR (-1)
+static pthread_mutex_t s_sim_allow_data_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_sim_allow_data_cond = PTHREAD_COND_INITIALIZER;
+static int s_sim_allow_data_value = -1;
+
 
 typedef struct{
     int uToken;
@@ -49,6 +59,7 @@
 struct sockaddr_in addr_serv;
 static int sock_fd = 0;
 int Global_uToken = 0;
+static int default_cnt = 20;
 static pthread_mutex_t g_lynq_sim_sendto_mutex;
 /**
  * @brief mark call initialization state
@@ -79,42 +90,32 @@
     int error;
 }lynq_resp_t;
 
-#define RESULT_OK (0)
-#define RESULT_ERROR (-1)
+int waitAllowDataSignal(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_sim_allow_data_mutex);
+    ret = pthread_cond_timedwait(&s_sim_allow_data_cond,&s_sim_allow_data_mutex,&timeout);
+    pthread_mutex_unlock(&s_sim_allow_data_mutex);
+    return ret;
+}
 
-typedef enum{
-    /*base abnormal*/
-    LYNQ_E_PARAMETER_ANONALY=7000,
-    LYNQ_E_SEND_REQUEST_FAIL=7001,
-    LYNQ_E_GET_HEAD_ERROR=7002,
-    LYNQ_E_INNER_ERROR=7100,
-    LYNQ_E_MALLOC_ERROR=7101,
-    /**/
-    LYNQ_E_CARDSTATE_ERROR=8000,
-    /* The voice service state is out of service*/
-    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
-    /* The voice service state is EMERGENCY_ONLY*/
-    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
-    /* The radio power is power off*/
-    LYNQ_E_STATE_POWER_OFF=8003,
-    LYNQ_E_TIME_OUT=8004,
-    /*create or open sms DB fail */
-    LYNQ_E_SMS_DB_FAIL=8005,
-    /*Failed to execute sql statement*/
-    LYNQ_E_SMS_SQL_FAIL = 8006,
-    LYNQ_E_SMS_NOT_FIND = 8007,
-    /* The logic conflict*/
-    LYNQ_E_CONFLICT=9000,
-    /*Null anomaly*/
-    LYNQ_E_NULL_ANONALY=9001,
-     /*Invalid id anomaly*/
-    LYNQ_E_INVALID_ID_ANONALY=9002,
-#ifdef ECALL_SUPPORT
-    LYNQ_E_ECALL_BEING_RUNNING =9003,
-    LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
-    LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
-#endif
-}LYNQ_E;
+void sendAllowDataSignal(int value)
+{
+    pthread_mutex_lock(&s_sim_allow_data_mutex);
+    s_sim_allow_data_value = value;
+    pthread_cond_signal(&s_sim_allow_data_cond);
+    pthread_mutex_unlock(&s_sim_allow_data_mutex);
+    return;
+}
 
 /**@brief print solicied response msg's head information
 * @param head [IN]: head information
@@ -144,15 +145,18 @@
         return RESULT_ERROR;
     }
 }
-
-int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, const char* format,...)
+int get_utoken()
+{
+    return (Global_uToken++)%10000;/*0-10000*/
+}
+int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, int sim_count, const char* format,...)
 {
     lynq_client_t client;
     int ret;
     int send_num;
     int recv_num;
     char res_data[MAX_LEN] = {0};
-    client.uToken = Global_uToken;
+    client.uToken = get_utoken();
     if(request_id == RIL_REQUEST_SCREEN_STATE)
     {
         client.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE;
@@ -185,14 +189,28 @@
     }
     lynq_resp_t head;
     head.request = -1;
-    for(int i = 0; i < cnt;)
+    for(int i = 0; i < cnt; i++)
     {
+        head.resp_type = -1;
+        head.token = -1;
+        head.request = -1;
+        head.slot_id = -1;
+        head.error = -1;
         recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
         if(recv_num <= 0)
         {
-            RLOGD("recv request fail, recv num is %d", recv_num);
-            pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
-            return recv_num;
+            if (errno == EAGAIN || errno == EWOULDBLOCK) 
+            {
+                RLOGD("recv from timeout");
+                pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+                return LYNQ_E_TIME_OUT;
+            } 
+            else 
+            {
+                RLOGD("recv request fail, recv num is %d", recv_num);
+                pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+                return recv_num;
+            }
         }
         p->setData((uint8_t *)res_data,sizeof(char)*recv_num);
         p->setDataPosition(0);
@@ -200,12 +218,30 @@
         if(ret!=0)
         {
             RLOGD("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
+
+            if (head.token != client.uToken)
+            {
+                RLOGD("head.token is %d != client.uToken is %d", head.token, client.uToken);
+                ret = RESULT_ERROR;
+                continue;
+            }
+
             pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
             return ret;
         }
+        if (head.token != client.uToken)
+        {
+            RLOGD("head.token is %d != client.uToken is %d", head.token, client.uToken);
+            ret = RESULT_ERROR;
+            continue;
+        }
         if(request_id == head.request)
         {
-            i++;
+            sim_count--;
+            if(sim_count <= 0)
+                break;
+            else
+                continue;
         }
     }
     pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
@@ -249,17 +285,21 @@
     timeOut.tv_usec = 0;
     if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0) 
     {
-        RLOGD("time out setting failed\n"); 
+        RLOGD("time out setting failed\n");
         return -1;
     }
-    /* 设置address */  
-    memset(&addr_serv, 0, sizeof(addr_serv));  
-    addr_serv.sin_family = AF_INET;  
-    addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);  
-    addr_serv.sin_port = htons(DEST_PORT);  
-    len_addr_serv = sizeof(addr_serv);  
-    /*test*/
 
+    memset(&addr_serv, 0, sizeof(addr_serv));
+    addr_serv.sin_family = AF_INET;  
+    addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
+    addr_serv.sin_port = htons(DEST_PORT);
+    len_addr_serv = sizeof(addr_serv);
+    ret = lynq_start_all_urc_socket_thread();
+    if(ret != RESULT_OK)
+    {
+        LYERRLOG("init socket urc fail!!!");
+        return LYNQ_E_INNER_ERROR;
+    }
     RLOGE("%s end suc", __func__);
     return 0;
 }
@@ -273,6 +313,7 @@
         RLOGD("lynq_sim_deinit  failed");
         return -1;
     }
+    lynq_close_all_urc_socket_thread();
     g_lynq_sim_init_flag = 0;
     close(sock_fd);
 
@@ -296,7 +337,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,1,"");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,default_cnt,1,"");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -313,7 +354,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,1,"");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,default_cnt,1,"");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -334,7 +375,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,1,"");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,default_cnt,1,"");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -352,7 +393,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "1");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,default_cnt,1,"%s %s %s %s\n", "SC", pin, "11", "1");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -368,7 +409,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s%d", "AT+ESIMPOWER=", mode);
+    int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,default_cnt,1,"%s%d", "AT+ESIMPOWER=", mode);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -383,7 +424,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "0");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,default_cnt,1,"%s %s %s %s\n", "SC", pin, "11", "0");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -398,7 +439,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,1,"%s %s %s\n", "SC", pin, "11");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,default_cnt,1,"%s %s %s\n", "SC", pin, "11");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -424,7 +465,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,1,"%s\n", pin);
+    int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,default_cnt,1,"%s\n", pin);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -446,7 +487,7 @@
     if(!strlen(old_pin))
         return res;
     Parcel p;
-    res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,1,"%s %s\n", old_pin, new_pin);
+    res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,default_cnt,1,"%s %s\n", old_pin, new_pin);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -463,7 +504,7 @@
     if(puk == NULL || pin == NULL)
         return -1;
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,1,"%s %s\n", puk, pin);
+    int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,default_cnt,1,"%s %s\n", puk, pin);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -540,7 +581,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s\n", "AT+CNUM");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,default_cnt,1,"%s\n", "AT+CNUM");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -566,7 +607,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,default_cnt,1,"");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -587,7 +628,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
+    int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,default_cnt,1,"");
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -639,6 +680,105 @@
     return 0;
 }
 
+int lynq_set_default_sim(const int slot)
+{
+    if(g_lynq_sim_init_flag == 0)
+    {
+        RLOGE("can`t init SIM module");
+        return -1;
+    }
+    if(!judge(slot))
+    {
+        RLOGD("is not 0 or 1");
+        return -1;
+    }
+    int send_num = 0;
+    lynq_client_t client_t;
+    client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%d\n", slot);
+    pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)
+    {
+        RLOGD("function %s sendto error:", __FUNCTION__);
+        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+        return send_num;
+    }
+
+    if(waitAllowDataSignal(SIM_ALLOW_DATA_TIMEOUT) == ETIMEDOUT)
+    {
+        LYERRLOG("timeout:wait allow data fail!!!");
+        pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+        return LYNQ_E_TIME_OUT;
+    }
+    pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+    LYERRLOG("sim allow data value %d",s_sim_allow_data_value);
+    return s_sim_allow_data_value;
+}
+
+
+int lynq_set_default_sim_except_data(const int slot)
+{
+    RLOGD("Enter %s",__FUNCTION__);
+
+    if(g_lynq_sim_init_flag == 0)
+    {
+        return -1;
+    }
+
+    RLOGD("Slot is %d",slot);
+
+    if(!judge(slot))
+    {
+        RLOGD("is not 0 or 1");
+        return -1;
+    }
+
+    int send_num = 0;
+    Parcel p;
+    RLOGD("send LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA");
+    int res = lynq_send_common_request(&p,LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA,1,default_cnt,1,"%d",slot);
+    if(res != 0)
+    {
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
+    }
+    
+    return 0;
+}
+
+
+
+int lynq_get_default_sim_all(int *bit_slot)
+{
+    RLOGD("Enter %s",__FUNCTION__);
+
+    int sim_except_data = 0;
+    int sim_data = 0;
+
+    if(g_lynq_sim_init_flag == 0)
+    {
+        return -1;
+    }
+
+    int send_num = 0;
+    Parcel p;
+    
+    RLOGD("send LYNQ_REQUEST_GET_DEFAULT_SIM_ALL");
+    int res = lynq_send_common_request(&p,LYNQ_REQUEST_GET_DEFAULT_SIM_ALL,0,default_cnt,1,"");
+    if(res != 0)
+    {
+        RLOGD("function %s execute error", __FUNCTION__);
+        return res;
+    }
+
+    p.readInt32(bit_slot);
+    return 0;
+}
+
+
 int lynq_switch_card(int slot){
     if(g_lynq_sim_init_flag == 0)
     {
@@ -650,7 +790,7 @@
     lynq_client_t client_t;
     client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
     client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
+    client_t.uToken = get_utoken();
     sprintf(client_t.param, "%d\n", slot);
     pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); //because ril of id = -1
@@ -675,7 +815,7 @@
     if(!judge(num))
         return -1;
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,2,"%d\n",num);
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,default_cnt,2,"%d\n",num);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -697,7 +837,7 @@
     if(!judge(num))
         return -1;
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,2,"%d\n",num);
+    int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,default_cnt,2,"%d\n",num);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -780,7 +920,7 @@
         return -1;
     }
     Parcel p;
-    int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,1,"%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
+    int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,default_cnt,1,"%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
     if(res != 0)
     {
         RLOGD("function %s execute error", __FUNCTION__);
@@ -822,7 +962,7 @@
     lynq_client_t client_t;
     client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
     client_t.paramLen = 1;
-    client_t.uToken = Global_uToken;
+    client_t.uToken = get_utoken();
     sprintf(client_t.param, "%s\n", "AT+LRSTMD");
     pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
     send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);//because response not by ril callback
@@ -914,3 +1054,28 @@
     return 0;
 }
 
+void urc_msg_process(Parcel *p)
+{
+    int resp_type;
+    int urcid;
+    int slot_id;
+    int error_code;
+
+    int size=p->dataSize();
+    p->readInt32(&resp_type);
+    p->readInt32(&urcid);
+    p->readInt32(&slot_id);
+    LYINFLOG("%s urc id = %d, slot_id = %d, size is %d",__func__, urcid,slot_id,size);
+    switch (urcid)
+    {
+        case LYNQ_URC_ALLOW_DATA://new sms received
+        {
+            LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
+            p->readInt32(&error_code);
+            sendAllowDataSignal(error_code);
+            break;
+        }
+        default:
+            break;
+    }
+}
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.cpp b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.cpp
new file mode 100755
index 0000000..daee1d3
--- /dev/null
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.cpp
@@ -0,0 +1,173 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include <list>
+#include <vendor-ril/telephony/ril.h>
+#include <vendor-ril/telephony/mtk_ril_sp.h>
+#include "liblog/lynq_deflog.h"
+#include "lynq_sim_urc.h"
+
+int module_len_urc_addr_serv;
+struct sockaddr_in module_urc_addr_serv;
+static int module_urc_sock_fd = -1;
+int module_urc_status = 1;
+pthread_t module_urc_tid = -1;
+
+static pthread_mutex_t s_ProcessUrcMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
+#define BLOCK_PROCESS_URC_MSG_INIT() pthread_mutex_init(&s_ProcessUrcMsgBlockMutex,NULL)
+#define BLOCK_PROCESS_URC_MSG_LOCK() pthread_mutex_lock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_PROCESS_URC_MSG_UNLOCK() pthread_mutex_unlock(&s_ProcessUrcMsgBlockMutex)
+
+bool is_support_urc(int urc_id)
+{
+    switch(urc_id)
+    {
+        case LYNQ_URC_ALLOW_DATA:
+            return true;
+        default:
+            return false;
+    }
+}
+
+void *thread_urc_recv(void *p)
+{
+    Parcel *urc_p =NULL;
+    char urc_data[LYNQ_REC_BUF];
+    int res = 0;
+    lynq_head_t* phead;
+    LYINFLOG("urc recv thread is running");
+    while(module_urc_status)
+    {
+        bzero(urc_data,LYNQ_REC_BUF);
+        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+        if(res<sizeof(int32_t)*2)
+        {
+            LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
+            continue;
+        }
+
+        phead=(lynq_head_t*) urc_data;
+        if(is_support_urc(phead->urcid)==false)
+        {
+            continue;
+        }
+        urc_p = new Parcel();
+        if(urc_p == NULL)
+        {
+            LYERRLOG("new parcel failure!!!");
+            continue;
+        }
+        urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
+        urc_p->setDataPosition(0);
+        if(urc_p->dataAvail()>0)
+        {
+            urc_msg_process(urc_p);
+        }
+        else 
+        {
+            delete urc_p;
+            urc_p = NULL;
+        }        
+    }
+    LYINFLOG("urc recv thread ended");
+    return NULL;
+}
+
+void lynq_close_urc_rev_thread()
+{
+    int ret;
+
+    BLOCK_PROCESS_URC_MSG_LOCK();  //just cancel urc process tid when recv from
+    module_urc_status = 0;
+    if(module_urc_tid!=-1)
+    {
+        ret = pthread_cancel(module_urc_tid);
+        LYINFLOG("pthread cancel urc rev ret = %d",ret);
+    }
+    BLOCK_PROCESS_URC_MSG_UNLOCK();
+    if(module_urc_tid != -1)
+    {
+        ret = pthread_join(module_urc_tid,NULL);
+        LYINFLOG("pthread join urc tid ret = %d",ret);
+        module_urc_tid =-1;
+    }
+}
+
+void lynq_close_urc_socket()
+{
+    if (module_urc_sock_fd >= 0)
+    {
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+    }
+}
+
+int lynq_setup_urc_socket()
+{
+    int on = 1;
+    int ret = 0;
+    module_len_urc_addr_serv = sizeof(sockaddr_in);
+    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if (module_urc_sock_fd <0){
+        LYERRLOG("urc socket error");
+        return RESULT_ERROR;  
+    }
+    module_urc_addr_serv.sin_family = AF_INET;
+    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+    if(ret <0)
+    {
+        LYERRLOG("urc socket set error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;  
+    }
+    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+    if(ret <0)
+    {
+        LYERRLOG("urc socket bind error");
+        close(module_urc_sock_fd);
+        module_urc_sock_fd =-1;
+        return RESULT_ERROR;
+    }
+    return RESULT_OK;
+}
+
+int lynq_start_all_urc_socket_thread()
+{
+    int ret= lynq_setup_urc_socket();
+    if(ret!=RESULT_OK)
+    {
+        LYERRLOG("call lynq_setup_urc_socket fail");
+        return RESULT_ERROR;
+    }
+
+    module_urc_status = 1;
+    ret = pthread_create(&module_urc_tid,NULL,thread_urc_recv,NULL);
+    if(ret <0)
+    {
+        LYERRLOG("urc recv pthread create error");
+        module_urc_status = 0;
+        lynq_close_urc_socket();
+        return RESULT_ERROR;
+    }
+    LYINFLOG("urc start success");
+    return RESULT_OK;  
+}
+
+void lynq_close_all_urc_socket_thread()
+{
+    lynq_close_urc_rev_thread();
+    lynq_close_urc_socket();
+    LYERRLOG("close all urc socket thread!!!");
+}
+
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.h b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.h
new file mode 100755
index 0000000..5173311
--- /dev/null
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.h
@@ -0,0 +1,23 @@
+#include "lynq_interface.h"
+using ::android::Parcel;
+
+#define LYNQ_ADDRESS "127.0.0.1"
+#define LYNQ_URC_SERVICE_PORT 8086
+#ifdef GSW_RIL_CFG
+#define LYNQ_URC_ADDRESS "127.255.255.255" /*hong.liu change broadcast addr on 2024.2.18*/
+#else
+#define LYNQ_URC_ADDRESS "0.0.0.0"
+#endif
+#define LYNQ_REC_BUF 8192
+
+#define RESULT_OK (0)
+#define RESULT_ERROR (-1)
+
+typedef struct{
+    int resp_type;
+    int urcid;   
+}lynq_head_t;
+
+void urc_msg_process(Parcel *p);
+int lynq_start_all_urc_socket_thread();
+void lynq_close_all_urc_socket_thread();
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp b/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp
index 87b21a6..729d7a8 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp
@@ -30,6 +30,9 @@
 int (*lynq_sim_power)(int mode);
 int (*lynq_reset_modem)(void);
 int (*lynq_screen)(int num);
+int (*lynq_set_default_sim)(const int slot);
+int (*lynq_set_default_sim_except_data)(const int slot);
+int (*lynq_get_default_sim_all)(int *bit_slot);
 
 
 int flag_init = 0;
@@ -41,15 +44,15 @@
 
 st_api_test_case api_testcases[] = 
 {
-    {0,    "lynq_sim_init"},
-    {1,    "lynq_enable_pin"},
-    {2,    "lynq_disable_pin"},
-    {4,    "lynq_get_iccid"},
-    {5,    "lynq_query_pin_lock"},
-    {6,    "lynq_verify_pin"},
-    {7,    "lynq_change_pin"},
-    {8,    "lynq_unlock_pin"},
-    {9,    "lynq_query_phone_number"},
+    {0,     "lynq_sim_init"},
+    {1,     "lynq_enable_pin"},
+    {2,     "lynq_disable_pin"},
+    {4,     "lynq_get_iccid"},
+    {5,     "lynq_query_pin_lock"},
+    {6,     "lynq_verify_pin"},
+    {7,     "lynq_change_pin"},
+    {8,     "lynq_unlock_pin"},
+    {9,     "lynq_query_phone_number"},
     {10,    "lynq_get_imsi"},
     {11,    "lynq_get_sim_status"},
     {12,    "lynq_sim_deinit"},
@@ -61,6 +64,9 @@
     {18,    "lynq_sim_power"},
     {19,    "lynq_reset_modem"},
     {20,    "lynq_screen"},
+    {21,    "lynq_set_default_sim"},
+    {22,    "lynq_set_default_sim_except_data"},
+    {23,    "lynq_get_default_sim_all"},
     {-1,    NULL}
 };
 
@@ -589,6 +595,66 @@
                 }
                 break;
             }
+            case 21:
+            {
+                lynq_set_default_sim = (int (*)(int))dlsym(dlHandle_sim,"lynq_set_default_sim");
+                if(NULL != lynq_set_default_sim)
+                {
+                    int slot;
+                    printf("input slot\n");
+                    scanf("%d", &slot);
+                    res = lynq_set_default_sim(slot);
+                    if(res == 0)
+                    {
+                        printf("lynq_set_default_sim success\n");
+                    }
+                    else
+                    {
+                        printf("lynq_set_default_sim error\n");
+                    }
+                }
+                break;
+            }
+            case 22:
+            {
+                lynq_set_default_sim_except_data = (int (*)(int))dlsym(dlHandle_sim,"lynq_set_default_sim_except_data");
+                if(NULL != lynq_set_default_sim_except_data)
+                {
+                    int slot;
+                    printf("input slot\n");
+                    scanf("%d", &slot);
+                    res = lynq_set_default_sim_except_data(slot);
+                    if(res == 0)
+                    {
+                        printf("lynq_set_default_sim_except_data success\n");
+                    }
+                    else
+                    {
+                        printf("lynq_set_default_sim_except_data error\n");
+                    }
+                }
+                break;
+            }
+            case 23:
+            {
+                lynq_get_default_sim_all = (int (*)(int *bit_slot))dlsym(dlHandle_sim,"lynq_get_default_sim_all");
+                if(NULL != lynq_get_default_sim_all)
+                {
+                    int bit_slot;
+                    res = lynq_get_default_sim_all(&bit_slot);
+                    if(res == 0)
+                    {
+                        printf("BIT0:other service slot;BIT1:data call slot\n");
+                        printf("BIT0=%d\n",(bit_slot&(1<<0))? 1 : 0);
+                        printf("BIT1=%d\n",(bit_slot&(1<<1))? 1 : 0);
+                    }
+                    else
+                    {
+                        printf("lynq_get_default_sim_all error\n");
+                    }
+                }
+                break;
+            }
             case -1:
             {
                 flag = 1;        /* exit */