sim: add qser_sim_addrxmsghandler api

Change-Id: I2e222074b6a715ad16f03717aecb9417e52989bd
diff --git a/mbtk/liblynq_lib/src/lynq_data_call.c b/mbtk/liblynq_lib/src/lynq_data_call.c
index 8b4d78a..a685ef5 100755
--- a/mbtk/liblynq_lib/src/lynq_data_call.c
+++ b/mbtk/liblynq_lib/src/lynq_data_call.c
@@ -150,13 +150,13 @@
 {
     if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
     {
-        LOGE("[qser_data_call] IDX range error.");
+        LOGE("IDX range error.");
         return QSER_RESULT_FAIL;
     }
     
     if(qser_apn_info_state[profile_idx] != TRUE)
     {
-        LOGE("[qser_data_call] profile_idx is not exist.");
+        LOGE("profile_idx is not exist.");
         return QSER_RESULT_FAIL;
     }
 
@@ -167,7 +167,7 @@
 {
     if(new_apn == NULL || old_apn == NULL)
     {
-        LOGE("[qser_data_call] qser_apn_info_param_convert apn param is NULL.");
+        LOGE("qser_apn_info_param_convert apn param is NULL.");
         return QSER_RESULT_FAIL;
     }
     
@@ -192,7 +192,7 @@
     //get apn name
     if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
     {
-        LOGE("[qser_data_call] apn_nmea length verylong.");
+        LOGE("apn_nmea length verylong.");
         return QSER_RESULT_FAIL;
     }
     else
@@ -210,7 +210,7 @@
     //get apn user
     if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
     {
-        LOGE("[qser_data_call] apn_user length verylong.");
+        LOGE("apn_user length verylong.");
         return QSER_RESULT_FAIL;
     }
     else
@@ -228,7 +228,7 @@
     //get apn password
     if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
     {
-        LOGE("[qser_data_call] apn_password length verylong.");
+        LOGE("apn_password length verylong.");
         return QSER_RESULT_FAIL;
     }
     else
@@ -267,7 +267,7 @@
         }
         else
         {
-            LOGE("[qser_data_call] auth input error!");
+            LOGE("auth input error!");
             return QSER_RESULT_FAIL;
         }
     }
@@ -288,23 +288,23 @@
 {
     if(apn == NULL)
     {
-        LOGE("[qser_data_call] qser_check_apn_type apn is NULL!");
+        LOGE("qser_check_apn_type apn is NULL!");
         return QSER_RESULT_FAIL;
     }
 
     //check default idx = 0
     int apn_name_length = strlen(apn->apn_name);
-    //LOGE("[qser_data_call] qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
+    //LOGE("qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
     char *p = strchr(qser_apn_info[0].apn_name, '.');
     if(p == NULL)
     {
-        LOGE("[qser_data_call] qser_check_apn_type not find!");
+        LOGE("qser_check_apn_type not find!");
         //return QSER_RESULT_FAIL;
     }
     else
     {
         int default_apn_name_length = p - (qser_apn_info[0].apn_name);
-        //LOGE("[qser_data_call] qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
+        //LOGE("qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
         if(default_apn_name_length == apn_name_length)
         {
             int i = 0;
@@ -319,7 +319,7 @@
                 }
                 else
                 {
-                    //LOGE("[qser_data_call] not char!");
+                    //LOGE("not char!");
                     if(qser_apn_info[0].apn_name[i] != apn->apn_name[i])
                     {
                         break;
@@ -331,7 +331,7 @@
 
             if(i == default_apn_name_length)
             {
-                LOGE("[qser_data_call] apn_name is same!idx = [0]");
+                LOGE("apn_name is same!idx = [0]");
                 return QSER_RESULT_FAIL;
             }
         }
@@ -348,20 +348,20 @@
         {
             if(strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
             {
-                LOGE("[qser_data_call] apn_type is same!idx = [%d]", pdp_type_tmp);
+                LOGE("apn_type is same!idx = [%d]", pdp_type_tmp);
                 return QSER_RESULT_FAIL;
             }
             if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0)
             {
                 if(qser_apn_info[pdp_type_tmp].pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
                 {
-                    LOGE("[qser_data_call] apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
+                    LOGE("apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
                     return QSER_RESULT_FAIL;
                 }
 
                 if(qser_apn_info[pdp_type_tmp].pdp_type == apn->pdp_type)
                 {
-                    LOGE("[qser_data_call] pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
+                    LOGE("pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
                     return QSER_RESULT_FAIL;
                 }
             }
@@ -423,21 +423,21 @@
         }
         else
         {
-            LOGE("[qser_data_call] cb fail,idx is %d.", idx);
+            LOGE("cb fail,idx is %d.", idx);
         }
         
     }
     else if(*net_data > 200)
     {
-        LOGE("[qser_data_call] cid[%d] is open.", *net_data - 201);
+        LOGE("cid[%d] is open.", *net_data - 201);
     }
     else if(*net_data == 1)
     {
-        LOGE("[qser_data_call] pdp is open.");
+        LOGE("pdp is open.");
     }
     else
     {
-        LOGE("[qser_data_call] unkonwn param [%d].", *net_data);
+        LOGE("unkonwn param [%d].", *net_data);
     }
 }
 
@@ -452,7 +452,7 @@
     }
     else
     {
-        LOGE("[qser_data_call] arg is NULL.");
+        LOGE("arg is NULL.");
     }
 
     qser_data_call_state_s state = {0};
@@ -463,7 +463,7 @@
     int ret = qser_data_call_start(&qser_data_backup, &err);
     if(ret != QSER_RESULT_SUCCESS)
     {
-        LOGE("[qser_data_call] qser_data_call_start() fail.");
+        LOGE("qser_data_call_start() fail.");
         state.err = err;
         if(qser_net_status_cb != NULL)
         {
@@ -475,7 +475,7 @@
     ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
     if(ret != QSER_RESULT_SUCCESS)
     {
-        LOGE("[qser_data_call] qser_data_call_info_get() fail.");
+        LOGE("qser_data_call_info_get() fail.");
         state.err = err;
         if(qser_net_status_cb != NULL)
         {
@@ -501,6 +501,7 @@
 int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
 {
     //UNUSED(evt_cb);
+    mbtk_log_init("radio", "QSER_DATA_CALL");
     if(!inited && qser_info_handle == NULL)
     {
         qser_info_handle = mbtk_info_handle_get();
@@ -512,7 +513,7 @@
         }
         else
         {
-            LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
+            LOGE("mbtk_info_handle_get() fail.");
             return QSER_RESULT_FAIL;
         }
     }
@@ -528,7 +529,7 @@
     qser_net_status_cb = evt_cb;
 
     property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
-    LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
+    LOGE("qser_apn_add_save_state = %s", qser_apn_add_save_state);
     property_get("persist.qser.apn.auth", qser_apn_auth_state, "00000000");
     mbtk_apn_info_t apns[10] = {0};
     int apn_num = 10;
@@ -536,7 +537,7 @@
     int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
     if(ret != 0)
     {
-        LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
+        LOGE("mbtk_apn_get fail. [ret = %d]",ret);
         return QSER_RESULT_FAIL;
     }
     else
@@ -548,7 +549,7 @@
             {
                 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
                 {
-                    //LOGE("[qser_data_call] idx no open.");
+                    //LOGE("idx no open.");
 #if defined(MBTK_ALL_CID_SUPPORT)
                     if(apns[i].cid - 1 == 0)
                     {
@@ -567,7 +568,7 @@
 
                 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
                 {
-                    LOGE("[qser_data_call] qser_apn_info_param_convert fail");
+                    LOGE("qser_apn_info_param_convert fail");
                     return QSER_RESULT_FAIL;
                 }
                 else
@@ -585,7 +586,7 @@
     {
         qser_idx_pdp_state[idx] = false;
     }
-    LOGE("[qser_data_call] mbtk_info_handle_get() success.");
+    LOGE("mbtk_info_handle_get() success.");
     return QSER_RESULT_SUCCESS;
 }
 
@@ -599,23 +600,25 @@
             int ret = mbtk_info_handle_free(&qser_info_handle);
             if(ret)
             {
-                LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
+                LOGE("mbtk_info_handle_free() fail.");
             }
             else
             {
                 qser_info_handle_num = 0;
                 qser_info_handle = NULL;
+                qser_net_status_cb = NULL;
                 inited = FALSE;
             }
         } 
         else
         {
             qser_info_handle_num--;
+            qser_net_status_cb = NULL;
         }
     }
     else
     {
-        LOGE("[qser_data_call] handle not inited.");
+        LOGE("handle not inited.");
     }
 }
 
@@ -625,7 +628,7 @@
     //UNUSED(err);
     if(data_call == NULL || err == NULL)
     {
-        LOGE("[qser_data_call] data_call or err is NULL.");
+        LOGE("data_call or err is NULL.");
         if(err != NULL)
         {
             *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
@@ -635,7 +638,7 @@
     
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
@@ -643,7 +646,7 @@
 #if defined(MBTK_ALL_CID_SUPPORT)
     if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
     {
-        LOGE("[qser_data_call] default pdp exist.");
+        LOGE("default pdp exist.");
         *err = QSER_DATA_CALL_ERROR_UNKNOWN;
         return QSER_RESULT_FAIL;
     }
@@ -654,12 +657,12 @@
 #if defined(MBTK_ALL_CID_SUPPORT)
         if( data_call->profile_idx == 0 )
         {
-            LOGE("[qser_data_call] profile_idx = 0.");
+            LOGE("profile_idx = 0.");
         }
         else
 #endif
         {
-            LOGE("[qser_data_call] profile_idx is invalid.");
+            LOGE("profile_idx is invalid.");
             *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
             return QSER_RESULT_FAIL;
         }
@@ -669,7 +672,7 @@
     ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
     if(ret != 0)
     {
-        LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
+        LOGE("mbtk_data_call_start fail.[ret = %d]", ret);
         if(ret == MBTK_INFO_ERR_CID_EXIST)
         {
             *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
@@ -713,7 +716,7 @@
     UNUSED(err);
     if(data_call == NULL || err == NULL)
     {
-        LOGE("[qser_data_call] data_call or err is NULL.");
+        LOGE("data_call or err is NULL.");
         if(err != NULL)
         {
             *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
@@ -723,7 +726,7 @@
     
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
@@ -731,7 +734,7 @@
 #if defined(MBTK_ALL_CID_SUPPORT)
         if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
         {
-            LOGE("[qser_data_call] default pdp exist.");
+            LOGE("default pdp exist.");
             *err = QSER_DATA_CALL_ERROR_UNKNOWN;
             return QSER_RESULT_FAIL;
         }
@@ -742,12 +745,12 @@
 #if defined(MBTK_ALL_CID_SUPPORT)
         if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
         {
-            LOGE("[qser_data_call] profile_idx = 0 and not open default idx.");
+            LOGE("profile_idx = 0 and not open default idx.");
         }
         else
 #endif
         {
-            LOGE("[qser_data_call] profile_idx is invalid.");
+            LOGE("profile_idx is invalid.");
             *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
             return QSER_RESULT_FAIL;
         }
@@ -759,7 +762,7 @@
     pthread_attr_init(&thread_attr);
     if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
     {
-        LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
+        LOGE("pthread_attr_setdetachstate() fail.");
         *err = QSER_DATA_CALL_ERROR_UNKNOWN;
         return QSER_RESULT_FAIL;
     }
@@ -767,7 +770,7 @@
     //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
     if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
     {
-        LOGE("[qser_data_call] pthread_create() fail.");
+        LOGE("pthread_create() fail.");
         *err = QSER_DATA_CALL_ERROR_UNKNOWN;
         return QSER_RESULT_FAIL;
     }
@@ -783,13 +786,13 @@
     //UNUSED(err);
     if(err == NULL)
     {
-        LOGE("[qser_data_call] err is NULL.");
+        LOGE("err is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
@@ -799,12 +802,12 @@
 #if defined(MBTK_ALL_CID_SUPPORT)
         if(profile_idx == 0)
         {
-            LOGE("[qser_data_call] profile_idx = 0.");
+            LOGE("profile_idx = 0.");
         }
         else
 #endif
         {
-            LOGE("[qser_data_call] profile_idx is invalid.");
+            LOGE("profile_idx is invalid.");
             *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
             return QSER_RESULT_FAIL;
         }
@@ -814,7 +817,7 @@
     ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
     if(ret != 0)
     {
-        LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
+        LOGE("mbtk_data_call_stop fail.[ret = %d]", ret);
         if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
         {
             *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
@@ -851,7 +854,7 @@
 
     if(info == NULL || err == NULL)
     {
-        LOGE("[qser_data_call] info or err is NULL.");
+        LOGE("info or err is NULL.");
         if(err != NULL)
         {
             *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
@@ -861,7 +864,7 @@
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         *err = QSER_DATA_CALL_ERROR_NO_INIT;
         return QSER_RESULT_FAIL;
     }
@@ -871,12 +874,12 @@
 #if defined(MBTK_ALL_CID_SUPPORT)
         if(profile_idx == 0)
         {
-            LOGE("[qser_data_call] profile_idx = 0.");
+            LOGE("profile_idx = 0.");
         }
         else
 #endif
         {
-            LOGE("[qser_data_call] profile_idx is invalid.");
+            LOGE("profile_idx is invalid.");
             *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
             return QSER_RESULT_FAIL;
         }
@@ -893,7 +896,7 @@
     ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
     if(ret != 0)
     {
-        LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
+        LOGE("mbtk_data_call_state_get fail.[ret = %d]", ret);
         if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
         {
             *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
@@ -917,21 +920,21 @@
             info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
 
 #ifdef QSER_TEST
-            //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
+            //LOGE("IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
             if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
-                LOGE("[qser_data_call] IP error.");
+                LOGE("IP error.");
             } else {
-                LOGE("[qser_data_call] IP : %s", v4_buff);
+                LOGE("IP : %s", v4_buff);
             }
             if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
-                LOGE("[qser_data_call] PrimaryDNS error.");
+                LOGE("PrimaryDNS error.");
             } else {
-                LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
+                LOGE("PrimaryDNS : %s", v4_buff);
             }
             if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
-                LOGE("[qser_data_call] SecondaryDNS error.");
+                LOGE("SecondaryDNS error.");
             } else {
-                LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
+                LOGE("SecondaryDNS : %s", v4_buff);
             }
 #endif
         }
@@ -947,21 +950,21 @@
 #ifdef QSER_TEST
 			if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
             {
-				LOGE("[qser_data_call] IP error.");
+				LOGE("IP error.");
 			} else {
-				LOGE("[qser_data_call] IP : %s", v6_buff);
+				LOGE("IP : %s", v6_buff);
 			}
 			if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
             {
-				LOGE("[qser_data_call] PrimaryDNS error.");
+				LOGE("PrimaryDNS error.");
 			} else {
-				LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
+				LOGE("PrimaryDNS : %s", v6_buff);
 			}
 			if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
             {
-				LOGE("[qser_data_call] SecondaryDNS error.");
+				LOGE("SecondaryDNS error.");
 			} else {
-				LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
+				LOGE("SecondaryDNS : %s", v6_buff);
             }
 #endif
         }
@@ -987,25 +990,25 @@
     //UNUSED(apn);
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
     
     if(apn == NULL)
     {
-        LOGE("[qser_data_call] apn param is NULL.");
+        LOGE("apn param is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_check_profile_idx(apn->profile_idx) < 0)
     {
-        LOGE("[qser_data_call] profile_idx is invalid.");
+        LOGE("profile_idx is invalid.");
         return QSER_RESULT_FAIL;
     }
 
     if(strlen(apn->apn_name) == 0)
     {
-        LOGE("[qser_data_call] apn_name is NULL.");
+        LOGE("apn_name is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -1014,7 +1017,7 @@
     {
         if(qser_apn_default_idx > -1)
         {
-            LOGE("[qser_data_call] iot_default is exist.");
+            LOGE("iot_default is exist.");
             return QSER_RESULT_FAIL;
         }
     }
@@ -1023,7 +1026,7 @@
     /*add name and type verify*/
     if (qser_check_apn_name_type(apn) < 0)
     {
-        LOGE("[qser_data_call] check param error.");
+        LOGE("check param error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -1050,7 +1053,7 @@
     }
     else
     {
-        LOGE("[qser_data_call] pdp_type error.");
+        LOGE("pdp_type error.");
         return QSER_RESULT_FAIL;
     }
 
@@ -1074,23 +1077,23 @@
     #endif
     else
     {
-        LOGE("[qser_data_call] auth input error!");
+        LOGE("auth input error!");
         return QSER_RESULT_FAIL;
     }
 
     if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
     {
-        LOGE("[qser_data_call] setapn: %d, %d, %s, %s, %s, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
+        LOGE("setapn: %d, %d, %s, %s, %s, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
     }
     else
     {
-        LOGE("[qser_data_call] setapn: %d, %d, %s, NULL, NULL, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
+        LOGE("setapn: %d, %d, %s, NULL, NULL, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
     }
     
     ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
     if(ret < 0)
     {
-        LOGE("[qser_data_call] mbtk_apn_set fail!");
+        LOGE("mbtk_apn_set fail!");
         return QSER_RESULT_FAIL;
     }
 
@@ -1129,13 +1132,13 @@
     //UNUSED(apn);
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
     
     if(apn == NULL)
     {
-        LOGE("[qser_data_call] apn param is NULL.");
+        LOGE("apn param is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -1145,7 +1148,7 @@
         if(profile_idx != 0)
 #endif
         {
-            LOGE("[qser_data_call] profile_idx is invalid.");
+            LOGE("profile_idx is invalid.");
             return QSER_RESULT_FAIL;
         }
     }
@@ -1156,7 +1159,7 @@
     int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
     if(ret != 0)
     {
-        LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
+        LOGE("mbtk_apn_get fail. [ret = %d]",ret);
         return QSER_RESULT_FAIL;
     }
     else
@@ -1166,20 +1169,20 @@
         {
             if(apns[i].cid == profile_idx + 1)
             {
-                LOGE("[qser_data_call] find IDX.");
+                LOGE("find IDX.");
                 break;
             }
         }
 
         if(i == apn_num)
         {
-            LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
+            LOGE("not find IDX.[apn_num = %d]", apn_num);
             return QSER_RESULT_FAIL;
         }
 
         if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
         {
-            LOGE("[qser_data_call] qser_apn_info_param_convert fail");
+            LOGE("qser_apn_info_param_convert fail");
             return QSER_RESULT_FAIL;
         }
     }
@@ -1192,13 +1195,13 @@
     //UNUSED(profile_idx);
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
     
     if(apn == NULL)
     {
-        LOGE("[qser_data_call] apn param is NULL.");
+        LOGE("apn param is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -1207,14 +1210,14 @@
     {
         if(qser_apn_default_idx > -1)
         {
-            LOGE("[qser_data_call] iot_default is exist.");
+            LOGE("iot_default is exist.");
             return QSER_RESULT_FAIL;
         }
     }
     /*add name and type verify*/
     if (qser_check_apn_name_type(apn) < 0)
     {
-        LOGE("[qser_data_call] check param error.");
+        LOGE("check param error.");
         return QSER_RESULT_FAIL;
     }
 #endif
@@ -1223,7 +1226,7 @@
     char idx = qser_get_apn_profile_idx();
     if(idx > QSER_PROFILE_IDX_MAX)
     {
-        LOGE("[qser_data_call] idx is full.");
+        LOGE("idx is full.");
         return QSER_RESULT_FAIL;
     }
     else
@@ -1240,7 +1243,7 @@
         ret = qser_apn_set(&set_apn);
         if(ret != 0)
         {
-            LOGE("[qser_data_call] qser_apn_set fail.");
+            LOGE("qser_apn_set fail.");
             qser_apn_info_state[idx] = FALSE;
             return QSER_RESULT_FAIL;
         }
@@ -1254,19 +1257,19 @@
     //UNUSED(profile_idx);
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
     
     if(qser_idx_pdp_state[profile_idx] == true)
     {
-        LOGE("[qser_data_call] profile_idx[%d] open pdp.", profile_idx);
+        LOGE("profile_idx[%d] open pdp.", profile_idx);
         return QSER_RESULT_FAIL;
     }
 
     if(qser_check_profile_idx(profile_idx) < 0)
     {
-        LOGE("[qser_data_call] profile_idx is invalid.");
+        LOGE("profile_idx is invalid.");
         return QSER_RESULT_FAIL;
     }
 
@@ -1290,24 +1293,24 @@
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
     
     if(apn_list == NULL)
     {
-        LOGE("[qser_data_call] apn_list param is NULL.");
+        LOGE("apn_list param is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
-    LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
+    LOGE("qser_apn_add_save_state = %s", qser_apn_add_save_state);
     mbtk_apn_info_t apns[10] = {0};
     int apn_num = 10;
     int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
     if(ret != 0)
     {
-        LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
+        LOGE("mbtk_apn_get fail. [ret = %d]",ret);
         return QSER_RESULT_FAIL;
     }
     else
@@ -1324,13 +1327,13 @@
                     if((apns[i].cid - 1) != 0)
 #endif
                     {
-                        LOGE("[qser_data_call] idx no open.");
+                        LOGE("idx no open.");
                         continue;
                     }
                 }
                 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[apn_list->cnt], &apns[i]) != 0)
                 {
-                    LOGE("[qser_data_call] qser_apn_info_param_convert fail");
+                    LOGE("qser_apn_info_param_convert fail");
                     return QSER_RESULT_FAIL;
                 }
                 apn_list->cnt++;
@@ -1338,7 +1341,7 @@
         }
         else if(apn_num > QSER_APN_MAX_LIST)
         {
-            LOGE("[qser_data_call] apn_num overlong");
+            LOGE("apn_num overlong");
             return QSER_RESULT_FAIL;
         }
         else
diff --git a/mbtk/liblynq_lib/src/lynq_sim.c b/mbtk/liblynq_lib/src/lynq_sim.c
index 13040eb..7a45479 100755
--- a/mbtk/liblynq_lib/src/lynq_sim.c
+++ b/mbtk/liblynq_lib/src/lynq_sim.c
@@ -12,18 +12,48 @@
 extern int qser_info_handle_num;
 static bool inited = FALSE;
 static uint qser_h_sim = 0x5F6F7F8F;
+static QSER_SIM_RxMsgHandlerFunc_t qser_sim_state_cb = NULL;
+static bool qser_sim_cb_state = false;
 /****************************VARIABLE***************************************/
 
 /******************************FUNC*****************************************/
+void qser_sim_state_change_cb(const void* data, int data_len)
+{
+    uint8 *ptr = (uint8*)data;
+    LOGE("SIM state : %d\n", *ptr);
+    QSER_SIM_CARD_STATUS_INFO_T qser_sim_statue = {0};
+    if(*ptr == 0)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+    }
+    else if(*ptr == 1)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+    }
+    else if(*ptr == 18)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+    }
+    else
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
+    }
+    if(qser_sim_state_cb != NULL)
+    {
+        qser_sim_state_cb(&qser_sim_statue);
+    }
+}
+
 /******************************FUNC*****************************************/
 
 /****************************API***************************************/
 int qser_sim_client_init(sim_client_handle_type *ph_sim)
 {
     //UNUSED(ph_sim);
+    mbtk_log_init("radio", "QSER_SIM");
     if(ph_sim == NULL)
     {
-        LOGE("[qser_data_call] ph_sim is NULL.");
+        LOGE("ph_sim is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -38,7 +68,7 @@
         } 
         else
         {
-            LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
+            LOGE("mbtk_info_handle_get() fail.");
             return QSER_RESULT_FAIL;
         }
     }
@@ -53,7 +83,7 @@
     }
     *ph_sim = qser_h_sim;
 
-    LOGE("[qser_data_call] mbtk_info_handle_get() success.");
+    LOGE("mbtk_info_handle_get() success.");
     return QSER_RESULT_SUCCESS;
 }
 
@@ -66,19 +96,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(imsi == NULL || imsiLen < 15)
     {
-        LOGE("[qser_data_call] imsi is NULL.");
+        LOGE("imsi is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -86,13 +116,13 @@
     int err = mbtk_imsi_get(qser_info_handle, imsi);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_imsi_get is fail.");
+        LOGE("mbtk_imsi_get is fail.");
         return QSER_RESULT_FAIL;
     }
 
     if(strlen(imsi) > imsiLen)
     {
-        LOGE("[qser_data_call] get datalength out of range.");
+        LOGE("get datalength out of range.");
         return QSER_RESULT_FAIL;
     }
 
@@ -108,19 +138,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(iccid == NULL || iccidLen < QSER_SIM_ICCID_LEN_MAX)
     {
-        LOGE("[qser_data_call] iccid is NULL.");
+        LOGE("iccid is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -128,13 +158,13 @@
     int err = mbtk_iccid_get(qser_info_handle, iccid);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_iccid_get is fail.");
+        LOGE("mbtk_iccid_get is fail.");
         return QSER_RESULT_FAIL;
     }
 
     if(strlen(iccid) > iccidLen)
     {
-        LOGE("[qser_data_call] get datalength out of range.");
+        LOGE("get datalength out of range.");
         return QSER_RESULT_FAIL;
     }
     
@@ -150,19 +180,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(phone_num == NULL || phoneLen < 11)
     {
-        LOGE("[qser_data_call] phone_num is NULL.");
+        LOGE("phone_num is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -170,13 +200,13 @@
     int err = mbtk_phone_number_get(qser_info_handle, phone_num);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_phone_number_get is fail.");
+        LOGE("mbtk_phone_number_get is fail.");
         return QSER_RESULT_FAIL;
     }
 
     if(strlen(phone_num) > phoneLen)
     {
-        LOGE("[qser_data_call] get datalength out of range.");
+        LOGE("get datalength out of range.");
         return QSER_RESULT_FAIL;
     }
 
@@ -190,26 +220,26 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(pt_info == NULL)
     {
-        LOGE("[qser_data_call] pt_info is NULL.");
+        LOGE("pt_info is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     int err = mbtk_verify_pin(qser_info_handle, pt_info->pin_value);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_verify_pin is fail.");
+        LOGE("mbtk_verify_pin is fail.");
         return QSER_RESULT_FAIL;
     }
     
@@ -223,19 +253,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(pt_info == NULL)
     {
-        LOGE("[qser_data_call] pt_info is NULL.");
+        LOGE("pt_info is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -245,7 +275,7 @@
     int err = mbtk_change_pin(qser_info_handle, &pin_info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_change_pin is fail.");
+        LOGE("mbtk_change_pin is fail.");
         return QSER_RESULT_FAIL;
     }
     
@@ -259,19 +289,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(pt_info == NULL)
     {
-        LOGE("[qser_data_call] pt_info is NULL.");
+        LOGE("pt_info is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -281,7 +311,7 @@
     int err = mbtk_unlock_pin(qser_info_handle, &puk_pin_info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_unlock_pin is fail.");
+        LOGE("mbtk_unlock_pin is fail.");
         return QSER_RESULT_FAIL;
     }
 
@@ -295,19 +325,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(pt_info == NULL)
     {
-        LOGE("[qser_data_call] pt_info is NULL.");
+        LOGE("pt_info is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -317,7 +347,7 @@
     int err = mbtk_enable_pin(qser_info_handle, &pin_info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_enable_pin is fail.");
+        LOGE("mbtk_enable_pin is fail.");
         return QSER_RESULT_FAIL;
     }
     
@@ -331,19 +361,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(pt_info == NULL)
     {
-        LOGE("[qser_data_call] pt_info is NULL.");
+        LOGE("pt_info is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -353,7 +383,7 @@
     int err = mbtk_enable_pin(qser_info_handle, &pin_info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_enable_pin is fail.");
+        LOGE("mbtk_enable_pin is fail.");
         return QSER_RESULT_FAIL;
     }
     
@@ -368,19 +398,19 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(pt_info == NULL)
     {
-        LOGE("[qser_data_call] pt_info is NULL.");
+        LOGE("pt_info is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -390,12 +420,12 @@
     int err = mbtk_sim_state_get(qser_info_handle, &sim);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_sim_state_get fail [err = %d].", err);
+        LOGE("mbtk_sim_state_get fail [err = %d].", err);
         return QSER_RESULT_FAIL;
     }
     else
     {
-        LOGE("[qser_data_call] sim = %d.", sim);
+        LOGE("sim = %d.", sim);
         memset(pt_info, 0x0, sizeof(QSER_SIM_CARD_STATUS_INFO_T));
         switch (sim)
         {
@@ -426,7 +456,7 @@
     err = mbtk_sim_card_type_get(qser_info_handle, &sim_card_type);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_sim_state_get fail [err = %d].", err);
+        LOGE("mbtk_sim_state_get fail [err = %d].", err);
         return QSER_RESULT_FAIL;
     }
     else
@@ -442,7 +472,7 @@
     err = mbtk_pin_last_num_get(qser_info_handle, &qser_last_times);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_sim_state_get fail [err = %d].", err);
+        LOGE("mbtk_sim_state_get fail [err = %d].", err);
         return QSER_RESULT_FAIL;
     }
     else
@@ -463,26 +493,26 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(imei == NULL)
     {
-        LOGE("[qser_data_call] imei is NULL.");
+        LOGE("imei is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     int err = mbtk_imei_get(qser_info_handle, imei);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_imei_get Error : %d\n", err);
+        LOGE("mbtk_imei_get Error : %d\n", err);
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
@@ -495,19 +525,19 @@
     //UNUSED(sv);
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(imei == NULL || sv == NULL)
     {
-        LOGE("[qser_data_call] param is NULL.");
+        LOGE("param is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -515,7 +545,7 @@
     int err = mbtk_imei_get(qser_info_handle, imei);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_imei_get Error: %d\n", err);
+        LOGE("mbtk_imei_get Error: %d\n", err);
         return QSER_RESULT_FAIL;
     }
 
@@ -531,13 +561,13 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -548,7 +578,7 @@
     int err = mbtk_set_modem_fun(qser_info_handle, &info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_set_modem_fun Error : %d\n", err);
+        LOGE("mbtk_set_modem_fun Error : %d\n", err);
         return QSER_RESULT_FAIL;
     }
 
@@ -556,7 +586,7 @@
     err = mbtk_set_modem_fun(qser_info_handle, &info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_set_modem_fun Error : %d\n", err);
+        LOGE("mbtk_set_modem_fun Error : %d\n", err);
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
@@ -569,26 +599,26 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     if(buf == NULL)
     {
-        LOGE("[qser_data_call] buf is NULL.");
+        LOGE("buf is NULL.");
         return QSER_RESULT_FAIL;
     }
 
     int err = mbtk_version_get(qser_info_handle, buf);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_version_get Error : %d\n", err);
+        LOGE("mbtk_version_get Error : %d\n", err);
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
@@ -600,13 +630,13 @@
 
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
 
     if(qser_info_handle == NULL)
     {
-        LOGE("[qser_data_call] handle is NULL.");
+        LOGE("handle is NULL.");
         return QSER_RESULT_FAIL;
     }
 
@@ -619,7 +649,7 @@
     int err = mbtk_set_modem_fun(qser_info_handle, &info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_set_modem_fun Error : %d\n", err);
+        LOGE("mbtk_set_modem_fun Error : %d\n", err);
         return QSER_RESULT_FAIL;
     }
 
@@ -627,18 +657,49 @@
     err = mbtk_set_modem_fun(qser_info_handle, &info);
     if(err)
     {
-        LOGE("[qser_data_call] mbtk_set_modem_fun Error : %d\n", err);
+        LOGE("mbtk_set_modem_fun Error : %d\n", err);
         return QSER_RESULT_FAIL;
     }
     return QSER_RESULT_SUCCESS;
 }
 
+int qser_sim_addrxmsghandler(QSER_SIM_RxMsgHandlerFunc_t handlerPtr)
+{
+    if(qser_info_handle == NULL)
+    {
+        LOGE("handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(handlerPtr == NULL)
+    {
+        LOGE("param is NULL.");
+        qser_sim_state_cb = NULL;
+        return QSER_RESULT_SUCCESS;
+    }
+
+    qser_sim_state_cb = handlerPtr;
+    if(!qser_sim_cb_state)
+    {
+        int ret = mbtk_sim_state_change_cb_reg(qser_info_handle, qser_sim_state_change_cb);
+        if(ret != 0)
+        {
+            LOGE("set cb fail.");
+            qser_sim_state_cb = NULL;
+            return QSER_RESULT_FAIL;
+        }
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+
 int qser_sim_client_deinit(sim_client_handle_type h_sim)
 {
     //UNUSED(h_sim);
     if(h_sim != qser_h_sim)
     {
-        LOGE("[qser_data_call] h_sim is error.");
+        LOGE("h_sim is error.");
         return QSER_RESULT_FAIL;
     }
     
@@ -650,24 +711,26 @@
             int ret = mbtk_info_handle_free(&qser_info_handle);
             if(ret)
             {
-                LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
+                LOGE("mbtk_info_handle_free() fail.");
                 return QSER_RESULT_FAIL;
             }
             else
             {
                 qser_info_handle_num = 0;
                 qser_info_handle = NULL;
+                qser_sim_state_cb = NULL;
                 inited = FALSE;
             }
         } 
         else
         {
             qser_info_handle_num--;
+            qser_sim_state_cb = NULL;
         }
     }
     else
     {
-        LOGE("[qser_data_call] handle not inited.");
+        LOGE("handle not inited.");
         return QSER_RESULT_FAIL;
     }