[fix]
1.fix bug API 42
2.fix bug API 10
3.fix bug lynq_deinit_data

Change-Id: Ia2597f906a5816726afe25a208cc631e59d09272
diff --git a/lib/liblynq-data/lynq_data.cpp b/lib/liblynq-data/lynq_data.cpp
index b1f8512..4df67e7 100755
--- a/lib/liblynq-data/lynq_data.cpp
+++ b/lib/liblynq-data/lynq_data.cpp
@@ -1,32 +1,32 @@
-#include <stdio.h>

-#include <sys/types.h>

-#include <sys/socket.h>

-#include <arpa/inet.h>

-#include <fcntl.h>

-#include <string.h>

-#include <stdlib.h>

-#include <unistd.h>

-#include <binder/Parcel.h>

-#include <log/log.h>

-#include "lynq_data.h"

-#include <cutils/jstring.h>

-#include <pthread.h>

-#include "liblog/lynq_deflog.h"

-#include <sys/time.h>

-#define LYNQ_SERVICE_PORT 8088

-#define LYNQ_URC_SERVICE_PORT 8086

-#define LYNQ_REC_BUF 8192

-#define LYNQ_REQUEST_PARAM_BUF 8192

-#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3

-#define USER_LOG_TAG "LYNQ_DATA"

-

-using ::android::Parcel;

-typedef struct{

-    int uToken;

-    int request;

-    int paramLen;

-    char param[LYNQ_REQUEST_PARAM_BUF];

-}lynq_client_t;

+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include "lynq_data.h"
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include "liblog/lynq_deflog.h"
+#include <sys/time.h>
+#define LYNQ_SERVICE_PORT 8088
+#define LYNQ_URC_SERVICE_PORT 8086
+#define LYNQ_REC_BUF 8192
+#define LYNQ_REQUEST_PARAM_BUF 8192
+#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
+#define USER_LOG_TAG "LYNQ_DATA"
+
+using ::android::Parcel;
+typedef struct{
+    int uToken;
+    int request;
+    int paramLen;
+    char param[LYNQ_REQUEST_PARAM_BUF];
+}lynq_client_t;
 typedef enum{
     LYNQ_E_CARDSTATE_ERROR=8000,
     /* The voice service state is out of service*/
@@ -45,728 +45,740 @@
     LYNQ_E_CONFLICT=9000,
     /*Null anomaly*/
     LYNQ_E_NULL_ANONALY=9001
-}LYNQ_E;

-

-int lynq_client_sockfd = 0;

-int Global_uToken = 0;

-bool urc_recive_status = 1;

-int lynq_data_call_change_id = -1;

-static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

-static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;

-static pthread_mutex_t s_pdn_change_mutex = PTHREAD_MUTEX_INITIALIZER;

-static pthread_cond_t s_pdn_change_cond = PTHREAD_COND_INITIALIZER;

-

-typedef struct{

-    char apn[LYNQ_APN_MAX_LEN];

-    char apnType[LYNQ_APN_TYPE_MAX_LEN];

-    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];

-    int hasUsed;

-    int hasTimeout;

-}lynq_apn_t;

-lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};

-lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};

-int lynq_data_call = 0;

-

-int getLynqApnID(char apnType[])

-{

-    int ret = 0;

-    for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)

-    {

-        if(strcmp(lynq_apn_table[ret].apnType,apnType)==0)

-        {

-            return ret;

-        }

-    }

-    return -1;

-}

-void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])

-{

-    if(apn_table==NULL)

-    {

-        LYERRLOG("apn_table is null");

-        return;

-    }

-    memcpy(apn_table->apn,apn,strlen(apn)+1);

-    memcpy(apn_table->apnType,apntype,strlen(apntype)+1);

-    memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1);

-    apn_table->hasTimeout = 0;

-    apn_table->hasUsed = 1;

-    return;

-}

-void cleanOnceApnTable(int apnId)

-{

-    if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))

-    {

-        LYERRLOG("apn id is invalid!!!");

-        return;

-    }

-    lynq_apn_table[apnId].hasTimeout = 0;

-    lynq_apn_table[apnId].hasUsed = 0;

-    bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);

-    bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);

-    bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);

-    return;

-}

-int getUnusedElement()

-{

-    for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)

-    {

-        if(lynq_apn_table[i].hasUsed!=1)

-        {

-            return i;

-        }

-    }

-    return -1;

-}

-int updateApn(char apnType[])

-{

-    int ret = 0;

-    ret = getUnusedElement();

-    memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);

-    lynq_apn_table[ret].hasUsed = 1;

-    return ret;

-}

-

-int waitPdnChange()

-{

-    int ret = 0;

-    pthread_mutex_lock(&s_pdn_change_mutex);

-    ret = pthread_cond_wait(&s_pdn_change_cond,&s_pdn_change_mutex);

-    pthread_mutex_unlock(&s_pdn_change_mutex);

-    return ret;

-}

-int waitDataCallstateChange(int mtime)

-{

-    int ret = 0;

-    int sec = 0;

-    int usec = 0;

-    struct timeval now;

-    struct timespec timeout;

-    gettimeofday(&now,NULL);

-    sec = mtime/1000;

-    usec = mtime%1000;

-    timeout.tv_sec = now.tv_sec+sec;

-    timeout.tv_nsec = now.tv_usec*1000+usec*1000000;

-    pthread_mutex_lock(&s_data_call_state_change_mutex);

-    ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout);

-    pthread_mutex_unlock(&s_data_call_state_change_mutex);

-    return ret;

-}

-void sendSignalDataCallStateChange()

-{

-    pthread_mutex_lock(&s_data_call_state_change_mutex);

-    pthread_cond_signal(&s_data_call_state_change_cond);

-    pthread_mutex_unlock(&s_data_call_state_change_mutex);

-    return;

-}

-void sendSignalPdnChange()

-{

-    pthread_mutex_lock(&s_pdn_change_mutex);

-    pthread_cond_signal(&s_pdn_change_cond);

-    pthread_mutex_unlock(&s_pdn_change_mutex);

-    return;

-}

-

-int get_response(int sockfd,Parcel &p)

-{

-    int len = 0;

-    char recvline[LYNQ_REC_BUF];

-    bzero(recvline,LYNQ_REC_BUF);

-    /* receive data from server */

-    len = read(sockfd, recvline, LYNQ_REC_BUF);

-    if(len == -1)

-    {

-        perror("read error");

-        return -1;

-    }

-    printf("===>n=%d\n",len);

-    if (recvline != NULL) {

-        p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);

-        p.setDataPosition(0);

-    }

-    return 0;

-}

-int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)

-{

-    if(p.dataAvail() > 0)

-    {

-        p.readInt32(resp_type);

-        p.readInt32(request);

-        p.readInt32(slot_id);

-        p.readInt32(error);

-        return 0;

-    }

-    else

-    {

-        return -1;

-    }

-}

-int send_request(int sockfd,lynq_client_t *client_tmp)

-{

-    int ret=0;

-    ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);

-    if(ret==-1)

-    {

-        perror("write error");

-        return -1;

-    }

-    return 0;

-}

-static char *strdupReadString(Parcel &p) {

-    size_t stringlen;
-    const char16_t *s16;

-    s16 = p.readString16Inplace(&stringlen);

-    return strndup16to8(s16, stringlen);
-}

-static char *strdupReadString_p(Parcel *p) {

-    size_t stringlen;
-    const char16_t *s16;

-    s16 = p->readString16Inplace(&stringlen);

-    return strndup16to8(s16, stringlen);
-}

-

-

-/*Warren add for T800 platform 2021/11/19 start*/

-int lynq_socket_client_start()

-{

-    struct sockaddr_in lynq_socket_server_addr;

-    /* init lynq_socket_server_addr */

-    bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));

-    lynq_socket_server_addr.sin_family = AF_INET;

-    lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);

-    lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);

-    /*

-    if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)

-    {

-        printf("[%s] is not a valid IPaddress\n", argv[1]);

-        exit(1);

-    }

-*/

-    lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);

-    if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)

-    {

-        perror("connect error");

-        return -1;

-    }

-    return 0;

-}

-void *thread_urc_recv(void *parg)

+}LYNQ_E;
+
+int lynq_client_sockfd = 0;
+int Global_uToken = 0;
+bool data_urc_recive_status = 1;
+int lynq_data_call_change_id = -1;
+pthread_t lynq_data_tid =-1;
+static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t s_pdn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_pdn_change_cond = PTHREAD_COND_INITIALIZER;
+
+typedef struct{
+    char apn[LYNQ_APN_MAX_LEN];
+    char apnType[LYNQ_APN_TYPE_MAX_LEN];
+    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
+    int hasUsed;
+    int hasTimeout;
+}lynq_apn_t;
+lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};
+lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};
+int lynq_data_call = 0;
+int millli_sleep_with_restart(int millisecond)
 {
-    int socket_fd = (int64_t)parg;

-    int len=0;

-    socklen_t addr_len=0;

-    uint8_t *dataLength = NULL;

-    char urc_data[LYNQ_REC_BUF];

-    char apn[LYNQ_APN_MAX_LEN];

-    char apnType[LYNQ_APN_TYPE_MAX_LEN];

-    int pdnState = 0;

-    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];

-    int slot_id = -1;

-    int resp_type = -1;

-    int urcid = -1;

-    char *urc_msg = NULL;

-    Parcel *p = NULL;

-    struct sockaddr_in dest_addr;

-    LYINFLOG("thread_urc_recv in running....\n");

-    while(urc_recive_status)

-    {

-        bzero(urc_data,LYNQ_REC_BUF);

-        //get data msg

-        len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);

-        if(len <= 0)

+    int left = millisecond*1000;
+    while (left > 0) 
+    { 
+        left = usleep(left);
+    }
+
+    return 0;
+}
+int getLynqApnID(char apnType[])
+{
+    int ret = 0;
+    for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
+    {
+        if(strcmp(lynq_apn_table[ret].apnType,apnType)==0)
         {
-            perror("thread_urc_recv step2 fail:");

+            return ret;
+        }
+    }
+    return -1;
+}
+void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])
+{
+    LYDBGLOG("[updateApnTable] apn:%s,apntype:%s,ifaceName:%s",apn,apntype,ifaceName);
+    if(apn_table==NULL)
+    {
+        LYERRLOG("apn_table is null");
+        return;
+    }
+    memcpy(apn_table->apn,apn,strlen(apn)+1);
+    memcpy(apn_table->apnType,apntype,strlen(apntype)+1);
+    memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1);
+    apn_table->hasTimeout = 0;
+    apn_table->hasUsed = 1;
+    return;
+}
+void cleanOnceApnTable(int apnId)
+{
+    LYDBGLOG("apn id:%d",apnId);
+    if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))
+    {
+        LYERRLOG("apn id is invalid!!!");
+        return;
+    }
+    lynq_apn_table[apnId].hasTimeout = 0;
+    lynq_apn_table[apnId].hasUsed = 0;
+    bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);
+    //bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
+    bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
+    return;
+}
+int getUnusedElement()
+{
+    for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)
+    {
+        if(lynq_apn_table[i].hasUsed!=1)
+        {
+            return i;
+        }
+    }
+    return -1;
+}
+int updateApn(char apnType[])
+{
+    int ret = 0;
+    ret = getUnusedElement();
+    memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);
+    lynq_apn_table[ret].hasUsed = 1;
+    return ret;
+}
+
+int waitPdnChange()
+{
+    int ret = 0;
+    pthread_mutex_lock(&s_pdn_change_mutex);
+    ret = pthread_cond_wait(&s_pdn_change_cond,&s_pdn_change_mutex);
+    pthread_mutex_unlock(&s_pdn_change_mutex);
+    return ret;
+}
+int waitDataCallstateChange(int mtime)
+{
+    int ret = 0;
+    int sec = 0;
+    int usec = 0;
+    struct timeval now;
+    struct timespec timeout;
+    gettimeofday(&now,NULL);
+    sec = mtime/1000;
+    usec = mtime%1000;
+    timeout.tv_sec = now.tv_sec+sec;
+    timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
+    pthread_mutex_lock(&s_data_call_state_change_mutex);
+    ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout);
+    pthread_mutex_unlock(&s_data_call_state_change_mutex);
+    return ret;
+}
+void sendSignalDataCallStateChange()
+{
+    pthread_mutex_lock(&s_data_call_state_change_mutex);
+    pthread_cond_signal(&s_data_call_state_change_cond);
+    pthread_mutex_unlock(&s_data_call_state_change_mutex);
+    return;
+}
+void sendSignalPdnChange()
+{
+    pthread_mutex_lock(&s_pdn_change_mutex);
+    pthread_cond_signal(&s_pdn_change_cond);
+    pthread_mutex_unlock(&s_pdn_change_mutex);
+    return;
+}
+
+int get_response(int sockfd,Parcel &p)
+{
+    int len = 0;
+    char recvline[LYNQ_REC_BUF];
+    bzero(recvline,LYNQ_REC_BUF);
+    /* receive data from server */
+    len = read(sockfd, recvline, LYNQ_REC_BUF);
+    if(len == -1)
+    {
+        perror("read error");
+        return -1;
+    }
+    if (recvline != NULL) {
+        p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
+        p.setDataPosition(0);
+    }
+    return 0;
+}
+int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
+{
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(resp_type);
+        p.readInt32(request);
+        p.readInt32(slot_id);
+        p.readInt32(error);
+        return 0;
+    }
+    else
+    {
+        return -1;
+    }
+}
+int send_request(int sockfd,lynq_client_t *client_tmp)
+{
+    int ret=0;
+    ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);
+    if(ret==-1)
+    {
+        perror("write error");
+        return -1;
+    }
+    return 0;
+}
+static char *strdupReadString(Parcel &p) {
+    size_t stringlen;
+    const char16_t *s16;
+    s16 = p.readString16Inplace(&stringlen);
+    return strndup16to8(s16, stringlen);
+}
+static char *strdupReadString_p(Parcel *p) {
+    size_t stringlen;
+    const char16_t *s16;
+    s16 = p->readString16Inplace(&stringlen);
+    return strndup16to8(s16, stringlen);
+}
+
+
+/*Warren add for T800 platform 2021/11/19 start*/
+int lynq_socket_client_start()
+{
+    struct sockaddr_in lynq_socket_server_addr;
+    /* init lynq_socket_server_addr */
+    bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
+    lynq_socket_server_addr.sin_family = AF_INET;
+    lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
+    lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
+    /*
+    if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
+    {
+        printf("[%s] is not a valid IPaddress\n", argv[1]);
+        exit(1);
+    }
+*/
+    lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+    if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
+    {
+        perror("connect error");
+        return -1;
+    }
+    return 0;
+}
+void *thread_urc_recv(void *parg)
+{
+    int socket_fd = (int64_t)parg;
+    int len=0;
+    socklen_t addr_len=0;
+    uint8_t *dataLength = NULL;
+    char urc_data[LYNQ_REC_BUF];
+    char apn[LYNQ_APN_MAX_LEN];
+    char apnType[LYNQ_APN_TYPE_MAX_LEN];
+    int pdnState = 0;
+    char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
+    int slot_id = -1;
+    int resp_type = -1;
+    int urcid = -1;
+    char *urc_msg = NULL;
+    Parcel *p = NULL;
+    struct sockaddr_in dest_addr;
+    LYINFLOG("thread_urc_recv in running....\n");
+    while(data_urc_recive_status)
+    {
+        bzero(urc_data,LYNQ_REC_BUF);
+        //get data msg
+        len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
+        if(len <= 0)
+        {
+            perror("thread_urc_recv step2 fail:");
+            millli_sleep_with_restart(1);
             break;
-        }

-        LYDBGLOG("=====>urc data len<=====:%d\n",len);

-        p = new Parcel();

-        if(p==NULL)

-        {

-            RLOGD("new parcel failure!!!");

-            break;

-        }

-        p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);

-        p->setDataPosition(0);

-        if(p->dataAvail() > 0)

-        {

-            p->readInt32(&resp_type);

-            p->readInt32(&urcid);

-            p->readInt32(&slot_id);

-            //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

-            switch (urcid)

-            {

-                case 9003://LYNQ_URC_DATA_CALL_STATUS_IND

-                {

-                    LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);

-                    p->readInt32(&pdnState);

-                    bzero(apn,LYNQ_APN_MAX_LEN);

-                    bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);

-                    bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);

-                    if(pdnState!=4)//PDN_DISCONNECTED

-                    {

-                        urc_msg = strdupReadString_p(p);

-                        int len = strlen(urc_msg);

-                        if(len < LYNQ_APN_MAX_LEN-1)

-                        {

-                            memcpy(apn,urc_msg,len+1);

-                        }

-                        urc_msg = strdupReadString_p(p);

-                        len = strlen(urc_msg);

-                        if(len < LYNQ_APN_TYPE_MAX_LEN-1)

-                        {

-                            memcpy(apnType,urc_msg,len+1);

-                        }

-                        urc_msg = strdupReadString_p(p);

-                        len = strlen(urc_msg);

-                        if(len < LYNQ_IFACE_NAME_MAX_LEN-1)

-                        {

-                            memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);

-                        }

-                        //sendSignalDataCallStateChange();

-                    }

-                    int apnId = getLynqApnID(apnType);

-                    if(lynq_apn_table[apnId].hasTimeout==1)

-                    {

-                        LYERRLOG("apn:%s has time out",lynq_apn_table[apnId].apn);

-                        lynq_deactive_data_call(&apnId);

-                        continue;

-                    }

-                    updateApnTable(&lynq_apn_table[apnId], apn,apnType,ifaceName);

-                    sendSignalPdnChange();

-                    lynq_data_call_change_id = apnId;

-                    if(lynq_data_call==1)

-                    {

-                        sendSignalDataCallStateChange();

-                        lynq_data_call = 0;

-                    }

-                    /*

-                    if(dataCb!=NULL)

-                    {

-                        (*dataCb)(apn,apnType,pdnState,ifaceName);

-                    }

-                    */

-                    break;

-                }

-                default:

-                    break;

-            }

-        }

-        delete p;

-        p = NULL;

-    }

-    close(socket_fd);

-}

-int lynq_socket_urc_start()

-{

-    int socket_fd=0;

-    int rt=0;

-    int len=0;

-    int on=1;

-    struct sockaddr_in urc_local_addr;

-    pthread_t tid;

-    pthread_attr_t attr;

+        }
+        LYDBGLOG("=====>urc data len<=====:%d\n",len);
+        p = new Parcel();
+        if(p==NULL)
+        {
+            RLOGD("new parcel failure!!!");
+            break;
+        }
+        p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
+        p->setDataPosition(0);
+        if(p->dataAvail() > 0)
+        {
+            p->readInt32(&resp_type);
+            p->readInt32(&urcid);
+            p->readInt32(&slot_id);
+            //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
+            switch (urcid)
+            {
+                case 9003://LYNQ_URC_DATA_CALL_STATUS_IND
+                {
+                    LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
+                    p->readInt32(&pdnState);
+                    bzero(apn,LYNQ_APN_MAX_LEN);
+                    bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
+                    bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
+                    if(pdnState!=4)//PDN_DISCONNECTED
+                    {
+                        urc_msg = strdupReadString_p(p);
+                        int len = strlen(urc_msg);
+                        if(len < LYNQ_APN_MAX_LEN-1)
+                        {
+                            memcpy(apn,urc_msg,len+1);
+                        }
+                        urc_msg = strdupReadString_p(p);
+                        len = strlen(urc_msg);
+                        if(len < LYNQ_APN_TYPE_MAX_LEN-1)
+                        {
+                            memcpy(apnType,urc_msg,len+1);
+                        }
+                        urc_msg = strdupReadString_p(p);
+                        len = strlen(urc_msg);
+                        if(len < LYNQ_IFACE_NAME_MAX_LEN-1)
+                        {
+                            memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
+                        }
+                        //sendSignalDataCallStateChange();
+                        int apnId = getLynqApnID(apnType);
+                        if(apnId >= 0)
+                        {
+                            if(lynq_apn_table[apnId].hasTimeout==1)
+                            {
+                                LYERRLOG("apn:%s has time out",lynq_apn_table[apnId].apn);
+                                lynq_deactive_data_call(&apnId);
+                                continue;
+                            }
+                            updateApnTable(&lynq_apn_table[apnId], apn,apnType,ifaceName);
+                        }
+                        lynq_data_call_change_id = apnId;
+                        sendSignalPdnChange();
+                        LYDBGLOG("data call state:%d",lynq_data_call);
+                        if(lynq_data_call==1)
+                        {
+                            sendSignalDataCallStateChange();
+                            lynq_data_call = 0;
+                        }
+                    }
+                    else
+                    {
+                        urc_msg = strdupReadString_p(p);
+                        len = strlen(urc_msg);
+                        if(len < LYNQ_APN_TYPE_MAX_LEN-1)
+                        {
+                            memcpy(apnType,urc_msg,len+1);
+                        }
+                        LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType);
+                        int apnId = getLynqApnID(apnType);
+                        if(apnId >= 0)
+                        {
+                            lynq_data_call_change_id = apnId;
+                            bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
+                        }
+                        sendSignalPdnChange();
+                        LYDBGLOG("data call state:%d",lynq_data_call);
+                        if(lynq_data_call==1)
+                        {
+                            sendSignalDataCallStateChange();
+                            lynq_data_call = 0;
+                        }
+                    }
+                    break;
+                }
+                default:
+                    break;
+            }
+        }
+        delete p;
+        p = NULL;
+    }
+    close(socket_fd);
+}
+int lynq_socket_urc_start()
+{
+    int socket_fd=0;
+    int rt=0;
+    int len=0;
+    int on=1;
+    struct sockaddr_in urc_local_addr;
+    pthread_attr_t attr;
     socket_fd = socket(AF_INET,SOCK_DGRAM,0);
-    printf("test 001\n");
     if(socket_fd < 0)
     {
-        perror("creaet socket for udp fail");

+        perror("creaet socket for udp fail");
         return -1;
-    }

-    urc_local_addr.sin_family = AF_INET;

-    urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);

-    urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);

-    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/

+    }
+    urc_local_addr.sin_family = AF_INET;
+    urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+    urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
     rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
     if(rt<0)
     {
-        perror("SO_REUSEADDR fail\n");

-        return -1;

-    }

-    rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));

+        perror("SO_REUSEADDR fail\n");
+        return -1;
+    }
+    rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
     if (rt == -1)
     {
-        perror("bind failed");

+        perror("bind failed");
         return -1;
-    }

-    pthread_attr_init(&attr);

-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

-    rt = pthread_create(&tid,&attr,thread_urc_recv,(void *)socket_fd);

-    if(rt < 0)

-    {

-        printf("urc loop failure!!!\n");

-        return -1;

-    }

-    printf("urc loop success!!!\n");

-    return 0;

-}

-void lynq_call_state_change_test(int soc_id)

-{

-    printf("call state change,sim:%d\n",soc_id);

-}

-void lynq_data_call_state_cb_test(char apn[LYNQ_APN_MAX_LEN],char apnType[LYNQ_APN_TYPE_MAX_LEN],int pdnState,char ifaceName[LYNQ_IFACE_NAME_MAX_LEN])

-{

-    printf("data state change,apn=%s,apntype=%s,pdnstate=%d,ifacename=%s:%d\n",apn,apnType,pdnState,ifaceName);

-}

-

-int lynq_init_data(int uToken)

-{

-    int result = 0;

-    Global_uToken = uToken;

-    LYLOGSET(LOG_INFO);

-    LYLOGEINIT(USER_LOG_TAG);

-    result = lynq_socket_client_start();

-    if(result!=0)

-    {

-        LYERRLOG("init socket client fail!!!");

-        return -1;

-    }

-    result = lynq_socket_urc_start();

-    if(result!=0)

-    {

-        LYERRLOG("init socket urc fail!!!");

-        return -1;

-    }

-    memset(lynq_apn_table,0,sizeof(lynq_apn_table));

-    LYDBGLOG("lynq init call success!!!");

-    return 0;

-

-}

-int lynq_deinit_data()

-{

-    close(lynq_client_sockfd);

-    for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++)

-    {

-        if(lynq_apn_table[i].apnType!=NULL)

-        {

-            lynq_deactive_data_call(&i);

-        }

-    }

-    urc_recive_status = 0;

-    return 0;

-}

-int lynq_setup_data_call(int *handle)

-{

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

-    char iface = NULL;

-    int lynq_data_call_id = 0;

-    if(handle==NULL)

-    {

-        LYERRLOG("handle is null!!!");

-        return LYNQ_E_NULL_ANONALY;

-    }

-    client.uToken = Global_uToken;

-    client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL

-    client.paramLen = 0;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    if(send_request(lynq_client_sockfd,&client)==-1)

-    {

-        LYERRLOG("send request fail");

-        perror("[LYNQ_DATA] send request fail:");

-        return -1;

-    }

-    get_response(lynq_client_sockfd,p);

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

-    {

-        if(waitDataCallstateChange(1000)==ETIMEDOUT)//1000ms

-        {

-            error = LYNQ_E_TIME_OUT;

-            LYERRLOG("timeout:wait data Call state fail!!!");

-            lynq_apn_table[lynq_data_call_id].hasTimeout = 1;

-            return error;

-        }

-        *handle = lynq_data_call_id;

-    }

-    return error;

-}

-int lynq_deactive_data_call(int *handle)

-{

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

-    int lynq_data_call_id = -1;

-    lynq_data_call_id = *handle;

-    if(handle==NULL)

-    {

-        LYERRLOG("handle is null!!!");

-        return -1;

-    }

-    client.uToken = Global_uToken;

-    client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL

-    if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")==0)

-    {

-        client.paramLen = 0;

-        bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    }

-    else

-    {

-        client.paramLen = 1;

-        bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-        sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);

-    }

-    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    if(send_request(lynq_client_sockfd,&client)==-1)

-    {

-        LYERRLOG("send request fail");

-        perror("[LYNQ_DATA] send request fail:");

-        return -1;

-    }

-    get_response(lynq_client_sockfd,p);

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

-    cleanOnceApnTable(lynq_data_call_id);

-    return error;

-}

-int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)

-{

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

-    char iface = NULL;

-    int lynq_data_call_id = -1;

-    char *argv[10] = {};

-    if(handle==NULL||apn==NULL||apnType==NULL)

-    {

-        LYERRLOG("handle ,apn or apntype is null!!!");

-        return -1;

-    }

-    if(user==NULL)

+    }
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    rt = pthread_create(&lynq_data_tid,&attr,thread_urc_recv,(void *)socket_fd);
+    if(rt < 0)
     {
-        argv[1] = "null";

+        LYERRLOG("urc loop failure!!!\n");
+        return -1;
+    }
+    LYDBGLOG("urc loop success!!!\n");
+    return 0;
+}
+int lynq_init_data(int uToken)
+{
+    int result = 0;
+    Global_uToken = uToken;
+    data_urc_recive_status = 1;
+    LYLOGSET(LOG_INFO);
+    LYLOGEINIT(USER_LOG_TAG);
+    result = lynq_socket_client_start();
+    if(result!=0)
+    {
+        LYERRLOG("init socket client fail!!!");
+        return -1;
+    }
+    result = lynq_socket_urc_start();
+    if(result!=0)
+    {
+        LYERRLOG("init socket urc fail!!!");
+        return -1;
+    }
+    memset(lynq_apn_table,0,sizeof(lynq_apn_table));
+    LYDBGLOG("lynq init call success!!!");
+    return 0;
+
+}
+int lynq_deinit_data()
+{
+    int ret = -1;
+    for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++)
+    {
+        if(strlen(lynq_apn_table[i].apnType)!=0)
+        {
+            lynq_deactive_data_call(&i);
+        }
+    }
+    if(lynq_client_sockfd>0)
+    {
+        close(lynq_client_sockfd);
+    }
+    data_urc_recive_status = 0;
+    ret = pthread_cancel(lynq_data_tid);
+    LYDBGLOG("pthread cancel ret = %d",ret);
+    ret = pthread_join(lynq_data_tid,NULL);
+    LYDBGLOG("pthread join ret = %d",ret);
+    return 0;
+}
+int lynq_setup_data_call(int *handle)
+{
+    Parcel p;
+    lynq_client_t client;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    char iface = NULL;
+    int lynq_data_call_id = 0;
+    if(handle==NULL)
+    {
+        LYERRLOG("handle is null!!!");
+        return LYNQ_E_NULL_ANONALY;
+    }
+    client.uToken = Global_uToken;
+    client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
+    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);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        LYERRLOG("send request fail");
+        perror("[LYNQ_DATA] send request fail:");
+        return -1;
+    }
+    get_response(lynq_client_sockfd,p);
+    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)
+    {
+        if(waitDataCallstateChange(20000)==ETIMEDOUT)//20s
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("timeout:wait data Call state fail!!!");
+            lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
+            return error;
+        }
+        *handle = lynq_data_call_id;
+    }
+    return error;
+}
+int lynq_deactive_data_call(int *handle)
+{
+    Parcel p;
+    lynq_client_t client;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    int lynq_data_call_id = -1;
+    lynq_data_call_id = *handle;
+    if(handle==NULL)
+    {
+        LYERRLOG("handle is null!!!");
+        return -1;
+    }
+    client.uToken = Global_uToken;
+    client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
+    if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")==0)
+    {
+        client.paramLen = 0;
+        bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
     }
     else
     {
-        argv[1] = user;

+        client.paramLen = 1;
+        bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
+        sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
+    }
+    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        LYERRLOG("send request fail");
+        perror("[LYNQ_DATA] send request fail:");
+        return -1;
+    }
+    get_response(lynq_client_sockfd,p);
+    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);
+    cleanOnceApnTable(lynq_data_call_id);
+    return error;
+}
+int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)
+{
+    Parcel p;
+    lynq_client_t client;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    char iface = NULL;
+    int lynq_data_call_id = -1;
+    char *argv[10] = {};
+    if(handle==NULL||apn==NULL||apnType==NULL)
+    {
+        LYERRLOG("handle ,apn or apntype is null!!!");
+        return -1;
+    }
+    if(user==NULL)
+    {
+        argv[1] = "null";
+    }
+    else
+    {
+        argv[1] = user;
     }
     if(password==NULL)
     {
-        argv[2] = "null";

+        argv[2] = "null";
     }
     else
     {
-        argv[2] = password;

+        argv[2] = password;
     }
     if(authType==NULL)
     {
-        argv[3] = "null";

+        argv[3] = "null";
     }
     else
     {
-        argv[3] = authType;

+        argv[3] = authType;
     }
     if(normalProtocol==NULL)
     {
-        argv[4] = "null";

+        argv[4] = "null";
     }
     else
     {
-        argv[4] = normalProtocol;

+        argv[4] = normalProtocol;
     }
     if(roamingProtocol==NULL)
     {
-        argv[5] = "null";

+        argv[5] = "null";
     }
     else
     {
-        argv[5] = roamingProtocol;

-    }

-    client.uToken = Global_uToken;

-    client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL

-    client.paramLen = 7;

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

-    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    if(send_request(lynq_client_sockfd,&client)==-1)

-    {

-        LYERRLOG("send request fail");

-        perror("[LYNQ_DATA] send request fail:");

-        return -1;

-    }

-    get_response(lynq_client_sockfd,p);

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

-    if(error==0)

-    {

-        if(waitDataCallstateChange(1000)==ETIMEDOUT)//1000ms

-        {

-            error = LYNQ_E_TIME_OUT;

-            LYERRLOG("timeout:wait data Call state fail!!!");

-            lynq_apn_table[lynq_data_call_id].hasTimeout = 1;

-            return error;

-        }

-        *handle = lynq_data_call_id;

-    }

-    return error;

-}

-/*

-int lynq_deactive_data_call_sp(int *handle,char *apnType)

-{

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

-    if(handle==NULL||apnType==NULL)

-    {

-        LYERRLOG("handle is null!!!");

-        return -1;

-    }

-    client.uToken = Global_uToken;

-    client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL

-    client.paramLen = 1;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    sprintf(client.param,"%s",apnType);

-    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    if(send_request(lynq_client_sockfd,&client)==-1)

-    {

-        LYERRLOG("send request fail");

-        perror("[LYNQ_DATA] send request fail:");

-        return -1;

-    }

-    get_response(lynq_client_sockfd,p);

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

-    return error;

-}

-*/

-int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)

-{

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

-    int version =0;

-    int num = 0;

-    int temp_int =0;

-    char *temp_char = NULL;

-    if(dataCallList==NULL)

-    {

-        LYERRLOG("dataCallList is null!!!");

-        return -1;

-    }

-    client.uToken = Global_uToken;

-    client.request = 57;//RIL_REQUEST_DATA_CALL_LIST

-    client.paramLen = 0;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    if(send_request(lynq_client_sockfd,&client)==-1)

-    {

-        LYERRLOG("send request fail");

-        perror("[LYNQ_DATA] send request fail:");

-        return -1;

-    }

-    get_response(lynq_client_sockfd,p);

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

-    p.readInt32(&version);

-    if(version==11)

-    {

-        p.readInt32(&num);

-        *realNum = num;

-        for (int i = 0; i < num; i++)

-        {

-            p.readInt32(&dataCallList[i].status);

-            p.readInt32(&dataCallList[i].suggestedRetryTime);

-            p.readInt32(&dataCallList[i].cid);

-            p.readInt32(&dataCallList[i].active);

-            temp_char = strdupReadString(p);

-            memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);

-            temp_char = strdupReadString(p);

-            memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);

-            temp_char = strdupReadString(p);

-            memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);

-            temp_char = strdupReadString(p);

-            memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);

-            temp_char = strdupReadString(p);

-            memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);

-            temp_char = strdupReadString(p);

-            memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);

-            p.readInt32(&dataCallList[i].mtu);

-        }

-    }

-    return error;

-}

-int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t dataCallList)

-{

-    lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};

-    int number = 0;

-    int lynq_data_call_id = 0;

-    int error = 0;

-    lynq_data_call_id = *handle;

-    if(handle==NULL)

-    {

-        LYERRLOG("handle is NULL");

-        return LYNQ_E_NULL_ANONALY;

-    }

-    memset(interDataCallList,0,sizeof(interDataCallList));

-    error = getDataCallLists(interDataCallList,&number);

-    if(error == 0)

-    {

-        for(int i = 0;i < number;i++)

-        {

-            if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)

-            {

-                dataCallList.active = interDataCallList[i].active;

-                dataCallList.suggestedRetryTime = interDataCallList[i].suggestedRetryTime;

-                dataCallList.cid = interDataCallList[i].cid;

-                dataCallList.status = interDataCallList[i].status;

-                dataCallList.mtu = interDataCallList[i].mtu;

-                memcpy(dataCallList.addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));

-                memcpy(dataCallList.ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));

-                memcpy(dataCallList.dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));

-                memcpy(dataCallList.type,interDataCallList[i].type,sizeof(interDataCallList[i].type));

-                memcpy(dataCallList.gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));

-                memcpy(dataCallList.pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));

-            }

-        }

-    }

-    return error;

-}

-int lynq_wait_data_call_state_change(int *handle)

-{

-    waitPdnChange();

-    *handle = lynq_data_call_change_id;

-    LYINFLOG("lynq data call id:%d",lynq_data_call_change_id);

-    return 0;

-}

-#if 0

-int main(int argc,char **argv)

-{

-    int n = 0;

-    n = lynq_init_call(lynq_call_state_change_test,2222);

-    if(n<0)

-    {

-        printf("lynq init call fail!!!\n");

-        return -1;

-    }

-    printf("lynq call init success!!!\n");

-    char phoneNum[LYNQ_PHONE_NUMBER_MAX];

-    sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);

-    lynq_call(phoneNum);

-    while(1)

-    {

-        sleep(1);

-    }

-    return 0;

-}

-#endif

-/*Warren add for T800 platform 2021/11/19 end*/

+        argv[5] = roamingProtocol;
+    }
+    client.uToken = Global_uToken;
+    client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
+    client.paramLen = 7;
+    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);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        LYERRLOG("send request fail");
+        perror("[LYNQ_DATA] send request fail:");
+        return -1;
+    }
+    get_response(lynq_client_sockfd,p);
+    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)
+    {
+        if(waitDataCallstateChange(20000)==ETIMEDOUT)//20s
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("timeout:wait data Call state fail!!!");
+            lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
+            return error;
+        }
+        *handle = lynq_data_call_id;
+    }
+    return error;
+}
+/*
+int lynq_deactive_data_call_sp(int *handle,char *apnType)
+{
+    Parcel p;
+    lynq_client_t client;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    if(handle==NULL||apnType==NULL)
+    {
+        LYERRLOG("handle is null!!!");
+        return -1;
+    }
+    client.uToken = Global_uToken;
+    client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
+    client.paramLen = 1;
+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
+    sprintf(client.param,"%s",apnType);
+    LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        LYERRLOG("send request fail");
+        perror("[LYNQ_DATA] send request fail:");
+        return -1;
+    }
+    get_response(lynq_client_sockfd,p);
+    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);
+    return error;
+}
+*/
+int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)
+{
+    Parcel p;
+    lynq_client_t client;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    int version =0;
+    int num = 0;
+    int temp_int =0;
+    char *temp_char = NULL;
+    if(dataCallList==NULL)
+    {
+        LYERRLOG("dataCallList is null!!!");
+        return -1;
+    }
+    client.uToken = Global_uToken;
+    client.request = 57;//RIL_REQUEST_DATA_CALL_LIST
+    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);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        LYERRLOG("send request fail");
+        perror("[LYNQ_DATA] send request fail:");
+        return -1;
+    }
+    get_response(lynq_client_sockfd,p);
+    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);
+    p.readInt32(&version);
+    if(version==11)
+    {
+        p.readInt32(&num);
+        *realNum = num;
+        for (int i = 0; i < num; i++)
+        {
+            p.readInt32(&dataCallList[i].status);
+            p.readInt32(&dataCallList[i].suggestedRetryTime);
+            p.readInt32(&dataCallList[i].cid);
+            p.readInt32(&dataCallList[i].active);
+            temp_char = strdupReadString(p);
+            memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);
+            temp_char = strdupReadString(p);
+            memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);
+            temp_char = strdupReadString(p);
+            memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);
+            temp_char = strdupReadString(p);
+            memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);
+            temp_char = strdupReadString(p);
+            memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);
+            temp_char = strdupReadString(p);
+            memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);
+            p.readInt32(&dataCallList[i].mtu);
+        }
+    }
+    return error;
+}
+int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList)
+{
+    lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};
+    int number = 0;
+    int lynq_data_call_id = 0;
+    int error = 0;
+    lynq_data_call_id = *handle;
+    if(handle==NULL)
+    {
+        LYERRLOG("handle is NULL");
+        return LYNQ_E_NULL_ANONALY;
+    }
+    memset(interDataCallList,0,sizeof(interDataCallList));
+    error = getDataCallLists(interDataCallList,&number);
+    if(error == 0)
+    {
+        for(int i = 0;i < number;i++)
+        {
+            if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)
+            {
+                dataCallList->active = interDataCallList[i].active;
+                dataCallList->suggestedRetryTime = interDataCallList[i].suggestedRetryTime;
+                dataCallList->cid = interDataCallList[i].cid;
+                dataCallList->status = interDataCallList[i].status;
+                dataCallList->mtu = interDataCallList[i].mtu;
+                memcpy(dataCallList->addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));
+                memcpy(dataCallList->ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));
+                memcpy(dataCallList->dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));
+                memcpy(dataCallList->type,interDataCallList[i].type,sizeof(interDataCallList[i].type));
+                memcpy(dataCallList->gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));
+                memcpy(dataCallList->pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));
+                LYDBGLOG("ifname:%s,addr:%s",dataCallList->ifname,dataCallList->addresses);
+            }
+        }
+    }
+    return error;
+}
+int lynq_wait_data_call_state_change(int *handle)
+{
+    waitPdnChange();
+    *handle = lynq_data_call_change_id;
+    LYINFLOG("lynq data call id:%d",lynq_data_call_change_id);
+    return 0;
+}
+/*Warren add for T800 platform 2021/11/19 end*/