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