diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 6772e2d..7fac4a6 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -74,6 +74,8 @@
 
 static int data_waiting_status = 0;
 
+static int data_invaild_error = 0;
+
 /**g_lynq_data_init_flag
 * @brief mark data initialization state
 * 0:deinit status
@@ -102,9 +104,11 @@
 int getLynqApnID(char apnType[])
 {
     int ret = 0;
+    int len = 0;
     for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
     {
-        if(strcmp(lynq_apn_table[ret].apnType,apnType)==0)
+        len = strlen(lynq_apn_table[ret].apnType)<strlen(apnType) ? strlen(lynq_apn_table[ret].apnType):strlen(apnType);
+        if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0)
         {
             return ret;
         }
@@ -145,6 +149,11 @@
 }
 int getUnusedElement()
 {
+	if (lynq_apn_table == NULL)
+	{
+		LYERRLOG("get UnusedElemnt apn_table is null");
+		return -1;
+	}
     for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)
     {
         if(lynq_apn_table[i].hasUsed!=1)
@@ -152,6 +161,7 @@
             return i;
         }
     }
+	LYERRLOG("None of get unused Element");
     return -1;
 }
 int updateApn(char apnType[])
@@ -347,6 +357,24 @@
     }    
 }
 
+int printf_apn_table()
+{
+    int ret = 0;
+	if (lynq_apn_table == NULL)
+	{
+		LYERRLOG("apn table is null");
+		return -1;
+	}	
+    for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
+    {
+        LYINFLOG("[Typethree test info]apn=%s ;apntype=%s ;ifname=%s ;hasTimeout = %d ; hasUsed = %d", \
+        lynq_apn_table[ret].apn,lynq_apn_table[ret].apnType,lynq_apn_table[ret].ifaceName, \
+        lynq_apn_table[ret].hasTimeout,lynq_apn_table[ret].hasUsed);
+    }
+    return 0;
+}
+
+
 void urc_msg_process(Parcel *p)
 {
     int len;
@@ -394,19 +422,23 @@
                 }
                 //sendSignalDataCallStateChange();
                 int apnId = getLynqApnID(apnType);
+                LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d",apnType,ifaceName,apn,pdnState);
                 if(apnId >= 0)
                 {
                     if(lynq_apn_table[apnId].hasTimeout==1)
                     {
+                        /*whether timeout?,real or not,*/
+                        printf_apn_table();
                         LYERRLOG("apn:%s has time out,deacive this apn",lynq_apn_table[apnId].apn);
                         if (NULL != lynq_apn_table[apnId].apn && NULL != lynq_apn_table[apnId].apnType && strlen(lynq_apn_table[apnId].apn)>0)
                         {
                             LYERRLOG("deactive this time out APN");
                             lynq_deactive_data_call(&apnId);
                         }
-                        else 
+                        else
                         {
-                            LYERRLOG("this table is invalid");
+                            /*if apn lose,update apn and deactive all apn*/
+                            LYERRLOG("this table is invalid update APN table");
                         }
                         break;
                     }
@@ -415,7 +447,9 @@
                 /*To be completed*/
                 else
                 {
-                    LYERRLOG("invalid apnId");
+					data_invaild_error = 1;
+                    printf_apn_table();
+                    LYERRLOG("invalid apnId:%d",apnId);
                     break;
                 }
                 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
@@ -587,6 +621,12 @@
     client.paramLen = 0;
     bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
     LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    lynq_data_call_id = updateApn("default");
+    if (lynq_data_call_id < 0)
+    {
+        LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
+        return -1;
+    }
     pthread_mutex_lock(&g_lynq_data_sendto_mutex);
     if(send_request(lynq_client_sockfd,&client)==-1)
     {
@@ -598,7 +638,6 @@
     pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
     JumpHeader(p,&resp_type,&request,&slot_id,&error);
     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
-    lynq_data_call_id = updateApn("default");
     lynq_data_call = 1;
     if(error==0)
     {
@@ -607,6 +646,12 @@
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
             lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
+			if (data_invaild_error == 1)
+			{
+				data_invaild_error = 0;
+				LYERRLOG("urc apn info error!!!");
+				return 8085;
+			}
             return error;
         }
         *handle = lynq_data_call_id;
@@ -725,6 +770,12 @@
     bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
     sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
     LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    lynq_data_call_id = updateApn(apnType);
+    if (lynq_data_call_id < 0)
+    {
+        LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
+        return -1;
+    }
     pthread_mutex_lock(&g_lynq_data_sendto_mutex);
     if(send_request(lynq_client_sockfd,&client)==-1)
     {
@@ -736,7 +787,6 @@
     pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
     JumpHeader(p,&resp_type,&request,&slot_id,&error);
     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
-    lynq_data_call_id = updateApn(apnType);
     lynq_data_call = 1;
     if(error==0)
     {
@@ -745,6 +795,12 @@
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
             lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
+			if (data_invaild_error == 1)
+			{
+				data_invaild_error = 0;
+				LYERRLOG("urc apn info error!!!");
+				return 8085;
+			}
             return error;
         }
         *handle = lynq_data_call_id;
