[feature]:
 1.add data call feature add bb

Change-Id: Id7e9769b352751c852304554ff9a6750edd099cd
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
new file mode 100755
index 0000000..b1f8512
--- /dev/null
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -0,0 +1,772 @@
+#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*/
+    LYNQ_E_STATE_OUT_OF_SERVICE=8001,
+    /* The voice service state is EMERGENCY_ONLY*/
+    LYNQ_E_STATE_EMERGENCY_ONLY=8002,
+    /* The radio power is power off*/
+    LYNQ_E_STATE_POWER_OFF=8003,
+    LYNQ_E_TIME_OUT=8004,
+    /*create or open sms DB fail */
+    LYNQ_E_SMS_DB_FAIL=8005,
+    /*Failed to execute sql statement*/
+    LYNQ_E_SMS_SQL_FAIL = 8006,
+    LYNQ_E_SMS_NOT_FIND = 8007,
+    /* The logic conflict*/
+    LYNQ_E_CONFLICT=9000,
+    /*Null anomaly*/
+    LYNQ_E_NULL_ANONALY=9001
+}LYNQ_E;

+

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

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

+        {
+            perror("thread_urc_recv step2 fail:");

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

+    socket_fd = socket(AF_INET,SOCK_DGRAM,0);
+    printf("test 001\n");
+    if(socket_fd < 0)
+    {
+        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*/

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

+    if (rt == -1)
+    {
+        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)

+    {
+        argv[1] = "null";

+    }
+    else
+    {
+        argv[1] = user;

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

+    }
+    else
+    {
+        argv[2] = password;

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

+    }
+    else
+    {
+        argv[3] = authType;

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

+    }
+    else
+    {
+        argv[4] = normalProtocol;

+    }
+    if(roamingProtocol==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*/