blob: b1f85125c349f5c1eeb14dba25fc332ad0adc1ad [file] [log] [blame]
lh13586612022-01-11 21:58:58 -08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <fcntl.h>
6#include <string.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <binder/Parcel.h>
10#include <log/log.h>
11#include "lynq_data.h"
12#include <cutils/jstring.h>
13#include <pthread.h>
14#include "liblog/lynq_deflog.h"
15#include <sys/time.h>
16#define LYNQ_SERVICE_PORT 8088
17#define LYNQ_URC_SERVICE_PORT 8086
18#define LYNQ_REC_BUF 8192
19#define LYNQ_REQUEST_PARAM_BUF 8192
20#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
21#define USER_LOG_TAG "LYNQ_DATA"
22
23using ::android::Parcel;
24typedef struct{
25 int uToken;
26 int request;
27 int paramLen;
28 char param[LYNQ_REQUEST_PARAM_BUF];
29}lynq_client_t;
30typedef enum{
31 LYNQ_E_CARDSTATE_ERROR=8000,
32 /* The voice service state is out of service*/
33 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
34 /* The voice service state is EMERGENCY_ONLY*/
35 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
36 /* The radio power is power off*/
37 LYNQ_E_STATE_POWER_OFF=8003,
38 LYNQ_E_TIME_OUT=8004,
39 /*create or open sms DB fail */
40 LYNQ_E_SMS_DB_FAIL=8005,
41 /*Failed to execute sql statement*/
42 LYNQ_E_SMS_SQL_FAIL = 8006,
43 LYNQ_E_SMS_NOT_FIND = 8007,
44 /* The logic conflict*/
45 LYNQ_E_CONFLICT=9000,
46 /*Null anomaly*/
47 LYNQ_E_NULL_ANONALY=9001
48}LYNQ_E;
49
50int lynq_client_sockfd = 0;
51int Global_uToken = 0;
52bool urc_recive_status = 1;
53int lynq_data_call_change_id = -1;
54static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
55static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
56static pthread_mutex_t s_pdn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
57static pthread_cond_t s_pdn_change_cond = PTHREAD_COND_INITIALIZER;
58
59typedef struct{
60 char apn[LYNQ_APN_MAX_LEN];
61 char apnType[LYNQ_APN_TYPE_MAX_LEN];
62 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
63 int hasUsed;
64 int hasTimeout;
65}lynq_apn_t;
66lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};
67lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};
68int lynq_data_call = 0;
69
70int getLynqApnID(char apnType[])
71{
72 int ret = 0;
73 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
74 {
75 if(strcmp(lynq_apn_table[ret].apnType,apnType)==0)
76 {
77 return ret;
78 }
79 }
80 return -1;
81}
82void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])
83{
84 if(apn_table==NULL)
85 {
86 LYERRLOG("apn_table is null");
87 return;
88 }
89 memcpy(apn_table->apn,apn,strlen(apn)+1);
90 memcpy(apn_table->apnType,apntype,strlen(apntype)+1);
91 memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1);
92 apn_table->hasTimeout = 0;
93 apn_table->hasUsed = 1;
94 return;
95}
96void cleanOnceApnTable(int apnId)
97{
98 if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))
99 {
100 LYERRLOG("apn id is invalid!!!");
101 return;
102 }
103 lynq_apn_table[apnId].hasTimeout = 0;
104 lynq_apn_table[apnId].hasUsed = 0;
105 bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);
106 bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
107 bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
108 return;
109}
110int getUnusedElement()
111{
112 for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)
113 {
114 if(lynq_apn_table[i].hasUsed!=1)
115 {
116 return i;
117 }
118 }
119 return -1;
120}
121int updateApn(char apnType[])
122{
123 int ret = 0;
124 ret = getUnusedElement();
125 memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);
126 lynq_apn_table[ret].hasUsed = 1;
127 return ret;
128}
129
130int waitPdnChange()
131{
132 int ret = 0;
133 pthread_mutex_lock(&s_pdn_change_mutex);
134 ret = pthread_cond_wait(&s_pdn_change_cond,&s_pdn_change_mutex);
135 pthread_mutex_unlock(&s_pdn_change_mutex);
136 return ret;
137}
138int waitDataCallstateChange(int mtime)
139{
140 int ret = 0;
141 int sec = 0;
142 int usec = 0;
143 struct timeval now;
144 struct timespec timeout;
145 gettimeofday(&now,NULL);
146 sec = mtime/1000;
147 usec = mtime%1000;
148 timeout.tv_sec = now.tv_sec+sec;
149 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
150 pthread_mutex_lock(&s_data_call_state_change_mutex);
151 ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout);
152 pthread_mutex_unlock(&s_data_call_state_change_mutex);
153 return ret;
154}
155void sendSignalDataCallStateChange()
156{
157 pthread_mutex_lock(&s_data_call_state_change_mutex);
158 pthread_cond_signal(&s_data_call_state_change_cond);
159 pthread_mutex_unlock(&s_data_call_state_change_mutex);
160 return;
161}
162void sendSignalPdnChange()
163{
164 pthread_mutex_lock(&s_pdn_change_mutex);
165 pthread_cond_signal(&s_pdn_change_cond);
166 pthread_mutex_unlock(&s_pdn_change_mutex);
167 return;
168}
169
170int get_response(int sockfd,Parcel &p)
171{
172 int len = 0;
173 char recvline[LYNQ_REC_BUF];
174 bzero(recvline,LYNQ_REC_BUF);
175 /* receive data from server */
176 len = read(sockfd, recvline, LYNQ_REC_BUF);
177 if(len == -1)
178 {
179 perror("read error");
180 return -1;
181 }
182 printf("===>n=%d\n",len);
183 if (recvline != NULL) {
184 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
185 p.setDataPosition(0);
186 }
187 return 0;
188}
189int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
190{
191 if(p.dataAvail() > 0)
192 {
193 p.readInt32(resp_type);
194 p.readInt32(request);
195 p.readInt32(slot_id);
196 p.readInt32(error);
197 return 0;
198 }
199 else
200 {
201 return -1;
202 }
203}
204int send_request(int sockfd,lynq_client_t *client_tmp)
205{
206 int ret=0;
207 ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);
208 if(ret==-1)
209 {
210 perror("write error");
211 return -1;
212 }
213 return 0;
214}
215static char *strdupReadString(Parcel &p) {
216 size_t stringlen;
217 const char16_t *s16;
218 s16 = p.readString16Inplace(&stringlen);
219 return strndup16to8(s16, stringlen);
220}
221static char *strdupReadString_p(Parcel *p) {
222 size_t stringlen;
223 const char16_t *s16;
224 s16 = p->readString16Inplace(&stringlen);
225 return strndup16to8(s16, stringlen);
226}
227
228
229/*Warren add for T800 platform 2021/11/19 start*/
230int lynq_socket_client_start()
231{
232 struct sockaddr_in lynq_socket_server_addr;
233 /* init lynq_socket_server_addr */
234 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
235 lynq_socket_server_addr.sin_family = AF_INET;
236 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
237 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
238 /*
239 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
240 {
241 printf("[%s] is not a valid IPaddress\n", argv[1]);
242 exit(1);
243 }
244*/
245 lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
246 if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
247 {
248 perror("connect error");
249 return -1;
250 }
251 return 0;
252}
253void *thread_urc_recv(void *parg)
254{
255 int socket_fd = (int64_t)parg;
256 int len=0;
257 socklen_t addr_len=0;
258 uint8_t *dataLength = NULL;
259 char urc_data[LYNQ_REC_BUF];
260 char apn[LYNQ_APN_MAX_LEN];
261 char apnType[LYNQ_APN_TYPE_MAX_LEN];
262 int pdnState = 0;
263 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
264 int slot_id = -1;
265 int resp_type = -1;
266 int urcid = -1;
267 char *urc_msg = NULL;
268 Parcel *p = NULL;
269 struct sockaddr_in dest_addr;
270 LYINFLOG("thread_urc_recv in running....\n");
271 while(urc_recive_status)
272 {
273 bzero(urc_data,LYNQ_REC_BUF);
274 //get data msg
275 len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
276 if(len <= 0)
277 {
278 perror("thread_urc_recv step2 fail:");
279 break;
280 }
281 LYDBGLOG("=====>urc data len<=====:%d\n",len);
282 p = new Parcel();
283 if(p==NULL)
284 {
285 RLOGD("new parcel failure!!!");
286 break;
287 }
288 p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
289 p->setDataPosition(0);
290 if(p->dataAvail() > 0)
291 {
292 p->readInt32(&resp_type);
293 p->readInt32(&urcid);
294 p->readInt32(&slot_id);
295 //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
296 switch (urcid)
297 {
298 case 9003://LYNQ_URC_DATA_CALL_STATUS_IND
299 {
300 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d\n",resp_type,urcid,slot_id);
301 p->readInt32(&pdnState);
302 bzero(apn,LYNQ_APN_MAX_LEN);
303 bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
304 bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
305 if(pdnState!=4)//PDN_DISCONNECTED
306 {
307 urc_msg = strdupReadString_p(p);
308 int len = strlen(urc_msg);
309 if(len < LYNQ_APN_MAX_LEN-1)
310 {
311 memcpy(apn,urc_msg,len+1);
312 }
313 urc_msg = strdupReadString_p(p);
314 len = strlen(urc_msg);
315 if(len < LYNQ_APN_TYPE_MAX_LEN-1)
316 {
317 memcpy(apnType,urc_msg,len+1);
318 }
319 urc_msg = strdupReadString_p(p);
320 len = strlen(urc_msg);
321 if(len < LYNQ_IFACE_NAME_MAX_LEN-1)
322 {
323 memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
324 }
325 //sendSignalDataCallStateChange();
326 }
327 int apnId = getLynqApnID(apnType);
328 if(lynq_apn_table[apnId].hasTimeout==1)
329 {
330 LYERRLOG("apn:%s has time out",lynq_apn_table[apnId].apn);
331 lynq_deactive_data_call(&apnId);
332 continue;
333 }
334 updateApnTable(&lynq_apn_table[apnId], apn,apnType,ifaceName);
335 sendSignalPdnChange();
336 lynq_data_call_change_id = apnId;
337 if(lynq_data_call==1)
338 {
339 sendSignalDataCallStateChange();
340 lynq_data_call = 0;
341 }
342 /*
343 if(dataCb!=NULL)
344 {
345 (*dataCb)(apn,apnType,pdnState,ifaceName);
346 }
347 */
348 break;
349 }
350 default:
351 break;
352 }
353 }
354 delete p;
355 p = NULL;
356 }
357 close(socket_fd);
358}
359int lynq_socket_urc_start()
360{
361 int socket_fd=0;
362 int rt=0;
363 int len=0;
364 int on=1;
365 struct sockaddr_in urc_local_addr;
366 pthread_t tid;
367 pthread_attr_t attr;
368 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
369 printf("test 001\n");
370 if(socket_fd < 0)
371 {
372 perror("creaet socket for udp fail");
373 return -1;
374 }
375 urc_local_addr.sin_family = AF_INET;
376 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
377 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
378 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
379 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
380 if(rt<0)
381 {
382 perror("SO_REUSEADDR fail\n");
383 return -1;
384 }
385 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
386 if (rt == -1)
387 {
388 perror("bind failed");
389 return -1;
390 }
391 pthread_attr_init(&attr);
392 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
393 rt = pthread_create(&tid,&attr,thread_urc_recv,(void *)socket_fd);
394 if(rt < 0)
395 {
396 printf("urc loop failure!!!\n");
397 return -1;
398 }
399 printf("urc loop success!!!\n");
400 return 0;
401}
402void lynq_call_state_change_test(int soc_id)
403{
404 printf("call state change,sim:%d\n",soc_id);
405}
406void 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])
407{
408 printf("data state change,apn=%s,apntype=%s,pdnstate=%d,ifacename=%s:%d\n",apn,apnType,pdnState,ifaceName);
409}
410
411int lynq_init_data(int uToken)
412{
413 int result = 0;
414 Global_uToken = uToken;
415 LYLOGSET(LOG_INFO);
416 LYLOGEINIT(USER_LOG_TAG);
417 result = lynq_socket_client_start();
418 if(result!=0)
419 {
420 LYERRLOG("init socket client fail!!!");
421 return -1;
422 }
423 result = lynq_socket_urc_start();
424 if(result!=0)
425 {
426 LYERRLOG("init socket urc fail!!!");
427 return -1;
428 }
429 memset(lynq_apn_table,0,sizeof(lynq_apn_table));
430 LYDBGLOG("lynq init call success!!!");
431 return 0;
432
433}
434int lynq_deinit_data()
435{
436 close(lynq_client_sockfd);
437 for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++)
438 {
439 if(lynq_apn_table[i].apnType!=NULL)
440 {
441 lynq_deactive_data_call(&i);
442 }
443 }
444 urc_recive_status = 0;
445 return 0;
446}
447int lynq_setup_data_call(int *handle)
448{
449 Parcel p;
450 lynq_client_t client;
451 int resp_type = -1;
452 int request = -1;
453 int slot_id = -1;
454 int error = -1;
455 char iface = NULL;
456 int lynq_data_call_id = 0;
457 if(handle==NULL)
458 {
459 LYERRLOG("handle is null!!!");
460 return LYNQ_E_NULL_ANONALY;
461 }
462 client.uToken = Global_uToken;
463 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
464 client.paramLen = 0;
465 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
466 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
467 if(send_request(lynq_client_sockfd,&client)==-1)
468 {
469 LYERRLOG("send request fail");
470 perror("[LYNQ_DATA] send request fail:");
471 return -1;
472 }
473 get_response(lynq_client_sockfd,p);
474 JumpHeader(p,&resp_type,&request,&slot_id,&error);
475 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
476 lynq_data_call_id = updateApn("default");
477 lynq_data_call = 1;
478 if(error==0)
479 {
480 if(waitDataCallstateChange(1000)==ETIMEDOUT)//1000ms
481 {
482 error = LYNQ_E_TIME_OUT;
483 LYERRLOG("timeout:wait data Call state fail!!!");
484 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
485 return error;
486 }
487 *handle = lynq_data_call_id;
488 }
489 return error;
490}
491int lynq_deactive_data_call(int *handle)
492{
493 Parcel p;
494 lynq_client_t client;
495 int resp_type = -1;
496 int request = -1;
497 int slot_id = -1;
498 int error = -1;
499 int lynq_data_call_id = -1;
500 lynq_data_call_id = *handle;
501 if(handle==NULL)
502 {
503 LYERRLOG("handle is null!!!");
504 return -1;
505 }
506 client.uToken = Global_uToken;
507 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
508 if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")==0)
509 {
510 client.paramLen = 0;
511 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
512 }
513 else
514 {
515 client.paramLen = 1;
516 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
517 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
518 }
519 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
520 if(send_request(lynq_client_sockfd,&client)==-1)
521 {
522 LYERRLOG("send request fail");
523 perror("[LYNQ_DATA] send request fail:");
524 return -1;
525 }
526 get_response(lynq_client_sockfd,p);
527 JumpHeader(p,&resp_type,&request,&slot_id,&error);
528 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
529 cleanOnceApnTable(lynq_data_call_id);
530 return error;
531}
532int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)
533{
534 Parcel p;
535 lynq_client_t client;
536 int resp_type = -1;
537 int request = -1;
538 int slot_id = -1;
539 int error = -1;
540 char iface = NULL;
541 int lynq_data_call_id = -1;
542 char *argv[10] = {};
543 if(handle==NULL||apn==NULL||apnType==NULL)
544 {
545 LYERRLOG("handle ,apn or apntype is null!!!");
546 return -1;
547 }
548 if(user==NULL)
549 {
550 argv[1] = "null";
551 }
552 else
553 {
554 argv[1] = user;
555 }
556 if(password==NULL)
557 {
558 argv[2] = "null";
559 }
560 else
561 {
562 argv[2] = password;
563 }
564 if(authType==NULL)
565 {
566 argv[3] = "null";
567 }
568 else
569 {
570 argv[3] = authType;
571 }
572 if(normalProtocol==NULL)
573 {
574 argv[4] = "null";
575 }
576 else
577 {
578 argv[4] = normalProtocol;
579 }
580 if(roamingProtocol==NULL)
581 {
582 argv[5] = "null";
583 }
584 else
585 {
586 argv[5] = roamingProtocol;
587 }
588 client.uToken = Global_uToken;
589 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
590 client.paramLen = 7;
591 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
592 sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
593 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
594 if(send_request(lynq_client_sockfd,&client)==-1)
595 {
596 LYERRLOG("send request fail");
597 perror("[LYNQ_DATA] send request fail:");
598 return -1;
599 }
600 get_response(lynq_client_sockfd,p);
601 JumpHeader(p,&resp_type,&request,&slot_id,&error);
602 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
603 lynq_data_call_id = updateApn(apnType);
604 if(error==0)
605 {
606 if(waitDataCallstateChange(1000)==ETIMEDOUT)//1000ms
607 {
608 error = LYNQ_E_TIME_OUT;
609 LYERRLOG("timeout:wait data Call state fail!!!");
610 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
611 return error;
612 }
613 *handle = lynq_data_call_id;
614 }
615 return error;
616}
617/*
618int lynq_deactive_data_call_sp(int *handle,char *apnType)
619{
620 Parcel p;
621 lynq_client_t client;
622 int resp_type = -1;
623 int request = -1;
624 int slot_id = -1;
625 int error = -1;
626 if(handle==NULL||apnType==NULL)
627 {
628 LYERRLOG("handle is null!!!");
629 return -1;
630 }
631 client.uToken = Global_uToken;
632 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
633 client.paramLen = 1;
634 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
635 sprintf(client.param,"%s",apnType);
636 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
637 if(send_request(lynq_client_sockfd,&client)==-1)
638 {
639 LYERRLOG("send request fail");
640 perror("[LYNQ_DATA] send request fail:");
641 return -1;
642 }
643 get_response(lynq_client_sockfd,p);
644 JumpHeader(p,&resp_type,&request,&slot_id,&error);
645 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
646 return error;
647}
648*/
649int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)
650{
651 Parcel p;
652 lynq_client_t client;
653 int resp_type = -1;
654 int request = -1;
655 int slot_id = -1;
656 int error = -1;
657 int version =0;
658 int num = 0;
659 int temp_int =0;
660 char *temp_char = NULL;
661 if(dataCallList==NULL)
662 {
663 LYERRLOG("dataCallList is null!!!");
664 return -1;
665 }
666 client.uToken = Global_uToken;
667 client.request = 57;//RIL_REQUEST_DATA_CALL_LIST
668 client.paramLen = 0;
669 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
670 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
671 if(send_request(lynq_client_sockfd,&client)==-1)
672 {
673 LYERRLOG("send request fail");
674 perror("[LYNQ_DATA] send request fail:");
675 return -1;
676 }
677 get_response(lynq_client_sockfd,p);
678 JumpHeader(p,&resp_type,&request,&slot_id,&error);
679 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
680 p.readInt32(&version);
681 if(version==11)
682 {
683 p.readInt32(&num);
684 *realNum = num;
685 for (int i = 0; i < num; i++)
686 {
687 p.readInt32(&dataCallList[i].status);
688 p.readInt32(&dataCallList[i].suggestedRetryTime);
689 p.readInt32(&dataCallList[i].cid);
690 p.readInt32(&dataCallList[i].active);
691 temp_char = strdupReadString(p);
692 memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);
693 temp_char = strdupReadString(p);
694 memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);
695 temp_char = strdupReadString(p);
696 memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);
697 temp_char = strdupReadString(p);
698 memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);
699 temp_char = strdupReadString(p);
700 memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);
701 temp_char = strdupReadString(p);
702 memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);
703 p.readInt32(&dataCallList[i].mtu);
704 }
705 }
706 return error;
707}
708int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t dataCallList)
709{
710 lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};
711 int number = 0;
712 int lynq_data_call_id = 0;
713 int error = 0;
714 lynq_data_call_id = *handle;
715 if(handle==NULL)
716 {
717 LYERRLOG("handle is NULL");
718 return LYNQ_E_NULL_ANONALY;
719 }
720 memset(interDataCallList,0,sizeof(interDataCallList));
721 error = getDataCallLists(interDataCallList,&number);
722 if(error == 0)
723 {
724 for(int i = 0;i < number;i++)
725 {
726 if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)
727 {
728 dataCallList.active = interDataCallList[i].active;
729 dataCallList.suggestedRetryTime = interDataCallList[i].suggestedRetryTime;
730 dataCallList.cid = interDataCallList[i].cid;
731 dataCallList.status = interDataCallList[i].status;
732 dataCallList.mtu = interDataCallList[i].mtu;
733 memcpy(dataCallList.addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));
734 memcpy(dataCallList.ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));
735 memcpy(dataCallList.dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));
736 memcpy(dataCallList.type,interDataCallList[i].type,sizeof(interDataCallList[i].type));
737 memcpy(dataCallList.gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));
738 memcpy(dataCallList.pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));
739 }
740 }
741 }
742 return error;
743}
744int lynq_wait_data_call_state_change(int *handle)
745{
746 waitPdnChange();
747 *handle = lynq_data_call_change_id;
748 LYINFLOG("lynq data call id:%d",lynq_data_call_change_id);
749 return 0;
750}
751#if 0
752int main(int argc,char **argv)
753{
754 int n = 0;
755 n = lynq_init_call(lynq_call_state_change_test,2222);
756 if(n<0)
757 {
758 printf("lynq init call fail!!!\n");
759 return -1;
760 }
761 printf("lynq call init success!!!\n");
762 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
763 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
764 lynq_call(phoneNum);
765 while(1)
766 {
767 sleep(1);
768 }
769 return 0;
770}
771#endif
772/*Warren add for T800 platform 2021/11/19 end*/