blob: 06913d4aa29a3fbc120f4dc8040a15f4dec57588 [file] [log] [blame]
you.chen5ef374a2023-12-26 17:25:16 +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#include <include/lynq_uci.h>
17#include <errno.h>
18#include <vector>
19#include "lynq_data_urc.h"
20
21#define LYNQ_SERVICE_PORT 8088
22#define LYNQ_RIL_FWK_IP "127.0.0.1"
23
24#define LYNQ_REC_BUF 8192
25#define LYNQ_REQUEST_PARAM_BUF 8192
26#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
27#define USER_LOG_TAG "LYNQ_DATA"
28
29#define LYNQ_DATA_UCI_BUF 258
30#define LYNQ_DATA_TIME_OUT 1000*120
31#define TELEPHONY_RESTART 10
32
33
34using ::android::Parcel;
35typedef struct{
36 int uToken;
37 int request;
38 int paramLen;
39 char param[LYNQ_REQUEST_PARAM_BUF];
40}lynq_client_t;
41typedef enum{
42 LYNQ_E_CARDSTATE_ERROR=8000,
43 /* The voice service state is out of service*/
44 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
45 /* The voice service state is EMERGENCY_ONLY*/
46 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
47 /* The radio power is power off*/
48 LYNQ_E_STATE_POWER_OFF=8003,
49 LYNQ_E_TIME_OUT=8004,
50 /*create or open sms DB fail */
51 LYNQ_E_SMS_DB_FAIL=8005,
52 /*Failed to execute sql statement*/
53 LYNQ_E_SMS_SQL_FAIL = 8006,
54 LYNQ_E_SMS_NOT_FIND = 8007,
55 LYNQ_E_GET_RESP_FAIL = 8008,
56 LYNQ_E_NOT_THIS_APN = 8087,
57 LYNQ_E_NOT_ANY_APN = 8088,
58 LYNQ_E_MD_NOT_READY = 8089,
59 /* The logic conflict*/
60 LYNQ_E_CONFLICT=9000,
61 /*Null anomaly*/
62 LYNQ_E_NULL_ANONALY=9001
63}LYNQ_E;
64
65typedef enum {
66 PDN_IDLE,
67 PDN_CONNECTING,
68 PDN_CONNECTED,
69 PDN_DISCONNECTING,
70 PDN_DISCONNECTED,
71 PDN_RETRYING,
72 PDN_FAILED,
73 PDN_SCANNING,
74 PDN_TIMEOUT_CANCEL,
75} RIL_Data_Call_PdnState;
76
77int lynq_client_sockfd = 0;
78int Global_uToken = 0;
79struct sockaddr_in lynq_data_socket_server_addr;
80int lynq_data_socket_server_addr_len;
81
82int lynq_data_call_change_id = -1;
83int lynq_telephony_restart_g = 0;
84pthread_t lynq_data_tid =-1;
85static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
86static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
87
88static pthread_mutex_t s_data_call_deactived_mutex = PTHREAD_MUTEX_INITIALIZER;
89static pthread_cond_t s_data_call_deactived_cond = PTHREAD_COND_INITIALIZER;
90
91
92static pthread_mutex_t s_lynq_apn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
93static pthread_cond_t s_lynq_apn_change_cond = PTHREAD_COND_INITIALIZER;
94static pthread_mutex_t s_lynq_urc_vector_mutex = PTHREAD_MUTEX_INITIALIZER;
95static pthread_cond_t s_lynq_urc_vector_cond = PTHREAD_COND_INITIALIZER;
96/**g_lynq_data_sendto_mutex
97* @brief mark data send request mutex
98*/
99static pthread_mutex_t g_lynq_data_sendto_mutex;
100/*This value data the state of the wait*/
101static int data_waiting_status = 0;
102/*The value indicates that 8085 error occurs in data*/
103static int data_invaild_error = 0;
104/*This value ensure the data call timing is correct*/
105static int data_timelimit = 0;
106
107/**g_lynq_data_init_flag
108* @brief mark data initialization state
109* 0:deinit status
110* 1:init state
111*/
112static int g_lynq_data_init_flag = 0;
113/**g_lynq_apn_result
114* @brief temp of apn result info
115*/
116char g_lynq_apn_result[1024] = {};
117int g_data_call_timeout_value = LYNQ_DATA_TIME_OUT;
118
119static std::vector<int> s_data_urc_wait_list;
120
121typedef struct
122{
123 char apn[LYNQ_APN_MAX_LEN];
124 char apnType[LYNQ_APN_TYPE_MAX_LEN];
125 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
126 int hasUsed;
127 int hasTimeout;
128 int status;
129 char statusApnType[LYNQ_APN_TYPE_MAX_LEN];
130}lynq_apn_t;
131lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};
132lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};
133int lynq_data_call = 0;
134
135int radio_switch(int status);
136
137int getLynqApnID(char apnType[])
138{
139 int ret = 0;
140 int len = 0;
141 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
142 {
143 len = strlen(apnType);
144 LYINFLOG("apn_table[%d].apnType:%s,input apntype:%s,len:%d",ret,lynq_apn_table[ret].apnType,apnType,len);
145 if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0)
146 {
147 return ret;
148 }
149 }
150 return -1;
151}
152
153int getDeactApnID(char apnType[])
154{
155 int ret = 0;
156 int len = 0;
157 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
158 {
159 len = strlen(apnType);
160 LYINFLOG("apn_table[%d].apnType:%s,input apntype:%s,len:%d",ret,lynq_apn_table[ret].apnType,apnType,len);
161 if(strncmp(lynq_apn_table[ret].statusApnType,apnType,len)==0)
162 {
163 return ret;
164 }
165 }
166 return -1;
167}
168
169void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])
170{
171 LYDBGLOG("[updateApnTable] apn:%s,apntype:%s,ifaceName:%s",apn,apntype,ifaceName);
172 if(apn_table==NULL)
173 {
174 LYERRLOG("apn_table is null");
175 return;
176 }
177 memcpy(apn_table->apn,apn,strlen(apn)+1);
178 memcpy(apn_table->apnType,apntype,strlen(apntype)+1);
179 memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1);
180 apn_table->hasTimeout = 0;
181 apn_table->hasUsed = 1;
182 return;
183}
184
185void cleanOnceApnTable(int apnId)
186{
187 LYDBGLOG("%s:apn id:%d",__FUNCTION__,apnId);
188 if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))
189 {
190 LYERRLOG("apn id is invalid!!!");
191 return;
192 }
193 lynq_apn_table[apnId].hasTimeout = 0;
194 lynq_apn_table[apnId].hasUsed = 0;
195 memcpy(lynq_apn_table[apnId].statusApnType,lynq_apn_table[apnId].apnType,strlen(lynq_apn_table[apnId].apnType));
196 bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);
197 bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
198 bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
199 lynq_apn_table[apnId].status = 32;
200 return;
201}
202void cleanDeactApn(int apnId)
203{
204 LYDBGLOG("%s:apn id:%d",__FUNCTION__,apnId);
205 if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))
206 {
207 LYERRLOG("apn id is invalid!!!");
208 return;
209 }
210 lynq_apn_table[apnId].status = 0;
211 bzero(lynq_apn_table[apnId].statusApnType,LYNQ_APN_TYPE_MAX_LEN);
212}
213
214void updateDeactApn(int apnId,int pdnState)
215{
216 LYDBGLOG("%s:apn id:%d",__FUNCTION__,apnId);
217 if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))
218 {
219 LYERRLOG("apn id is invalid!!!");
220 return;
221 }
222 lynq_apn_table[apnId].status = pdnState;
223}
224
225
226int getUnusedElement()
227{
228 if (lynq_apn_table == NULL)
229 {
230 LYERRLOG("get UnusedElemnt apn_table is null");
231 return -1;
232 }
233 for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)
234 {
235 if(lynq_apn_table[i].hasUsed!=1)
236 {
237 return i;
238 }
239 }
240 LYERRLOG("None of get unused Element");
241 return -1;
242}
243int updateApn(char apnType[])
244{
245 int ret = 0;
246 ret = getUnusedElement();
247 if(ret >= 0)
248 {
249 memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);
250 lynq_apn_table[ret].hasUsed = 1;
251 }
252 return ret;
253}
254//@return
255//other:this apn has been used in apn table
256//-1:this apn not has been used in apn table
257int check_used_apn(char apnType[])
258{
259 LYINFLOG("check_used_apn.apnType:%s",apnType);
260 int ret = 0;
261 int len = 0;
262 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
263 {
264 len = strlen(apnType);
265 if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0)
266 {
267 LYINFLOG("check_used_apn.apnType:%s in apn table",apnType);
268 return ret;
269 }
270 }
271 return -1;
272}
273int get_handle(char apnType[])
274{
275 int call_id = 0;
276 call_id = check_used_apn(apnType);
277 if(call_id == -1)
278 {
279 call_id = updateApn(apnType);
280 }
281 LYINFLOG("handle:%d",call_id);
282 return call_id;
283}
284
285int handleCheck(int handle)
286{
287 if ((handle >= 0) && (handle <= 6))
288 {
289 if (lynq_apn_table[handle].hasUsed == 1)
290 {
291 return 0;
292 }
293 return -1;
294 }
295 return -1;
296}
297int waitApnResult()
298{
299 int ret = 0;
300 LYINFLOG("start wait apn result!!!");
301 int sec = 0;
302 int usec = 0;
303 struct timeval now;
304 struct timespec timeout;
305 gettimeofday(&now, NULL);
306 sec = 20000 / 1000;
307 usec = 20000 % 1000;
308 timeout.tv_sec = now.tv_sec + sec;
309 timeout.tv_nsec = now.tv_usec * 1000 + usec * 1000000;
310 pthread_mutex_lock(&s_lynq_apn_change_mutex);
311 ret = pthread_cond_timedwait(&s_lynq_apn_change_cond, &s_lynq_apn_change_mutex, &timeout);
312 pthread_mutex_unlock(&s_lynq_apn_change_mutex);
313 return ret;
314}
315
316void sendSignalApnChange()
317{
318 LYINFLOG("start send Signal Apn Change");
319 pthread_mutex_lock(&s_lynq_apn_change_mutex);
320 pthread_cond_signal(&s_lynq_apn_change_cond);
321 pthread_mutex_unlock(&s_lynq_apn_change_mutex);
322 return;
323}
324
325int waitPdnChange()
326{
327 int ret = 0;
328 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
329 ret = pthread_cond_wait(&s_lynq_urc_vector_cond,&s_lynq_urc_vector_mutex);
330 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
331 return ret;
332}
333int waitDataCallstateChange(int mtime)
334{
335 int ret = 0;
336 int sec = 0;
337 int usec = 0;
338 struct timeval now;
339 struct timespec timeout;
340 gettimeofday(&now,NULL);
341 sec = mtime/1000;
342 usec = mtime%1000;
343 timeout.tv_sec = now.tv_sec+sec;
344 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
345 pthread_mutex_lock(&s_data_call_state_change_mutex);
346 ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout);
347 pthread_mutex_unlock(&s_data_call_state_change_mutex);
348 return ret;
349}
350void sendSignalDataCallStateChange()
351{
352 pthread_mutex_lock(&s_data_call_state_change_mutex);
353 pthread_cond_signal(&s_data_call_state_change_cond);
354 pthread_mutex_unlock(&s_data_call_state_change_mutex);
355 return;
356}
357int waitDeactived(int mtime)
358{
359 int ret = 0;
360 int sec = 0;
361 int usec = 0;
362 struct timeval now;
363 struct timespec timeout;
364 gettimeofday(&now,NULL);
365 sec = mtime/1000;
366 usec = mtime%1000;
367 timeout.tv_sec = now.tv_sec+sec;
368 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
369 pthread_mutex_lock(&s_data_call_deactived_mutex);
370 ret = pthread_cond_timedwait(&s_data_call_deactived_cond,&s_data_call_deactived_mutex,&timeout);
371 pthread_mutex_unlock(&s_data_call_deactived_mutex);
372 return ret;
373}
374void sendSignalDeactvied()
375{
376 pthread_mutex_lock(&s_data_call_deactived_mutex);
377 pthread_cond_signal(&s_data_call_deactived_cond);
378 pthread_mutex_unlock(&s_data_call_deactived_mutex);
379 return;
380}
381
382void sendSignalPdnChange()
383{
384 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
385 pthread_cond_signal(&s_lynq_urc_vector_cond);
386 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
387 return;
388}
389
390int get_response(int sockfd,Parcel &p)
391{
392 int len = 0;
393 char recvline[LYNQ_REC_BUF];
394 bzero(recvline,LYNQ_REC_BUF);
395 /* receive data from server */
396 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF,0,(struct sockaddr *)&lynq_data_socket_server_addr,(socklen_t *)&lynq_data_socket_server_addr_len);
397 //len = read(sockfd, recvline, LYNQ_REC_BUF);
398 if(len == -1)
399 {
400 LYERRLOG("get_response fail,errno:%d",errno);
401 return -1;
402 }
403 if (recvline != NULL) {
404 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
405 p.setDataPosition(0);
406 }
407 return 0;
408}
409/**@brief get utoken in range 0 to 10000
410* @return utoken
411*/
412int get_utoken()
413{
414 return (Global_uToken++)%10000;/*0-10000*/
415}
416/**@brief wait response with expected token and write msg to parcel in some time
417* @param fd [IN]: socket fd
418* @param p [OUT]: quote the parcel,if return success need delete p.
419* @param token [IN]: the expected token for the response msg
420* @return
421* 0:success
422* other:failure
423*/
424int wait_response(int sockfd,Parcel *& p,int utoken)
425{
426 int len = 0;
427 int flag = 1;
428 int count = 0;
429 int in_utoken = -1;
430 int resp_type = -1;
431 Parcel *temp = NULL;
432 char recvline[LYNQ_REC_BUF];
433 //Sometimes the socket is abnormal, causing the socket buffer to store the response of the last request.
434 //Here it does not return until the response corresponding to the request is read.
435 while(flag && (count < 20))//why?
436 {
437 bzero(recvline,LYNQ_REC_BUF);
438 count++;
439 LYINFLOG("wait_response,count:%d",count);
440 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF,0,(struct sockaddr *)&lynq_data_socket_server_addr,(socklen_t *)&lynq_data_socket_server_addr_len);
441 if(len == -1)
442 {
443 LYERRLOG("wait_response fail,errno:%d",errno);
444 return LYNQ_E_GET_RESP_FAIL;
445 }
446 if (len != 0)
447 {
448 temp = new Parcel;
449 int i = 0;
450 while((NULL == temp) && (i < 100))
451 {
452 usleep(1000);
453 temp = new Parcel;
454 i++;
455 }
456 if((i >= 100) || (NULL == temp))
457 {
458 LYERRLOG("wait_response i:%d",i);
459 return LYNQ_E_GET_RESP_FAIL;
460 }
461 temp->setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
462 temp->setDataPosition(0);
463 temp->readInt32(&resp_type);
464 temp->readInt32(&in_utoken);
465 LYINFLOG("[%s]in_utoken:%d,utoken:%d",__FUNCTION__,in_utoken,utoken);
466 if (in_utoken != utoken)
467 {
468 delete temp;
469 temp = NULL;
470 in_utoken = 0;
471 continue;
472 }
473 temp->setDataPosition(0);
474 p = temp;
475 flag = 0;
476 return 0;
477 }
478 else
479 {
480 LYERRLOG("recvline is null,errno:%d",errno);
481 return LYNQ_E_GET_RESP_FAIL;
482 }
483 }
484 return LYNQ_E_GET_RESP_FAIL;
485}
486
487int JumpHeader(Parcel *p,int *resp_type,int *utoken,int *request,int *slot_id,int *error)
488{
489 if(NULL == p)
490 {
491 LYERRLOG("JumpHeader is null");
492 return -1;
493 }
494 if(p->dataAvail() > 0)
495 {
496 p->readInt32(resp_type);
497 p->readInt32(utoken);
498 p->readInt32(request);
499 p->readInt32(slot_id);
500 p->readInt32(error);
501 return 0;
502 }
503 else
504 {
505 return -1;
506 }
507}
508void free_parcel(Parcel *p)
509{
510 if(p)
511 {
512 delete p;
513 p = NULL;
514 }
515}
516int send_request(int sockfd,lynq_client_t *client_tmp)
517{
518 int ret=0;
519 ret = sendto(sockfd,client_tmp,LYQN_SEDN_BUF,0,(struct sockaddr *)&lynq_data_socket_server_addr,lynq_data_socket_server_addr_len);
520 if(ret==-1)
521 {
522 LYERRLOG("%s:errno code:%d",__FUNCTION__,errno);
523 return -1;
524 }
525 return 0;
526}
527static char *strdupReadString(Parcel &p) {
528 size_t stringlen;
529 const char16_t *s16;
530 s16 = p.readString16Inplace(&stringlen);
531 return strndup16to8(s16, stringlen);
532}
533static char *strdupReadString_p(Parcel *p) {
534 size_t stringlen;
535 const char16_t *s16;
536 s16 = p->readString16Inplace(&stringlen);
537 return strndup16to8(s16, stringlen);
538}
539
540/*Warren add for T800 platform 2021/11/19 start*/
541int lynq_socket_client_start()
542{
543 int ret;
544 struct timeval timeOut;
545 struct sockaddr_in liblynq_data_socket;
546
547 ret = 0;
548 timeOut.tv_sec = 30;
549 timeOut.tv_usec = 0;
550 bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
551 bzero(&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr));
552
553 //set this lib socket config
554 liblynq_data_socket.sin_family = AF_INET;
555 liblynq_data_socket.sin_addr.s_addr = inet_addr(LYNQ_RIL_FWK_IP);
556
557 //set ril service socket config
558 lynq_data_socket_server_addr.sin_family = AF_INET;
559 lynq_data_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
560 lynq_data_socket_server_addr.sin_addr.s_addr = inet_addr(LYNQ_RIL_FWK_IP);
561 lynq_data_socket_server_addr_len = sizeof(lynq_data_socket_server_addr);
562
563 lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
564 ret = bind(lynq_client_sockfd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
565 if (-1 == ret)
566 {
567 LYERRLOG("liblynq_data_socket bind fail,errno:%d",errno);
568 return -1;
569 }
570 if (setsockopt(lynq_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
571 {
572 LYERRLOG("time out setting failed,errno:%d",errno);
573 return -1;
574 }
575 return 0;
576}
577
578bool is_support_urc(int urc_id)
579{
580 switch(urc_id)
581 {
582 case LYNQ_URC_DATA_CALL_STATUS_IND:
583
584 case LYNQ_URC_MODIFY_APNDB:
585 case LYNQ_URC_RESET_APNDB:
586 case LYNQ_TELEPHONY_RESTART:
587 return true;
588 default:
589 return false;
590 }
591}
592
593int printf_apn_table()
594{
595 int ret = 0;
596 if (lynq_apn_table == NULL)
597 {
598 LYERRLOG("apn table is null");
599 return -1;
600 }
601 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
602 {
603 LYINFLOG("[%s][%d] apn=%s ;apntype=%s ;ifname=%s ;hasTimeout = %d ; hasUsed = %d,status = %d,statusDeactApn = %s",__FUNCTION__,ret, \
604 lynq_apn_table[ret].apn,lynq_apn_table[ret].apnType,lynq_apn_table[ret].ifaceName, \
605 lynq_apn_table[ret].hasTimeout,lynq_apn_table[ret].hasUsed,lynq_apn_table[ret].status,lynq_apn_table[ret].statusApnType);
606 }
607 return 0;
608}
609
610void printf_apn_table_debug(const char *fun,int line)
611{
612 LYINFLOG("[%s][%d]apn_table msg",fun,line);
613 printf_apn_table();
614}
615
616void urc_msg_process(Parcel *p)
617{
618 int len;
619 int resp_type;
620 int urcid;
621 int slot_id;
622 int check_count = 0;
623 static int apnId=-1;
624
625 int pdnState = 0;
626 char apn[LYNQ_APN_MAX_LEN];
627 char apnType[LYNQ_APN_TYPE_MAX_LEN];
628 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
629 char *urc_msg = NULL;
630
631 int size = p->dataSize();
632 p->readInt32(&resp_type);
633 p->readInt32(&urcid);
634 p->readInt32(&slot_id);
635 LYINFLOG("data lib recv urc:resp_type=%d,urcid=%d,slot_id=%d,size=%d\n",resp_type,urcid,slot_id,size);
636 switch(urcid)
637 {
638 case LYNQ_URC_DATA_CALL_STATUS_IND:
639 p->readInt32(&pdnState);
640 bzero(apn,LYNQ_APN_MAX_LEN);
641 bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
642 bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
643 if(pdnState != RIL_Data_Call_PdnState::PDN_DISCONNECTED)//PDN_DISCONNECTED
644 {
645 urc_msg = strdupReadString_p(p);
646 int len = strlen(urc_msg);
647 if((len < LYNQ_APN_MAX_LEN-1) && (len > 0))
648 {
649 memcpy(apn,urc_msg,len+1);
650 }
651 free(urc_msg);
652 urc_msg = strdupReadString_p(p);
653 len = strlen(urc_msg);
654 if((len < LYNQ_APN_TYPE_MAX_LEN-1) && (len > 0))
655 {
656 memcpy(apnType,urc_msg,len+1);
657 }
658 free(urc_msg);
659 urc_msg = strdupReadString_p(p);
660 len = strlen(urc_msg);
661 if((len < LYNQ_IFACE_NAME_MAX_LEN-1) && (len > 0))
662 {
663 memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
664 }
665 free(urc_msg);
666 //sendSignalDataCallStateChange();
667 apnId = getLynqApnID(apnType);
668 if(apnId >= 0)
669 {
670 LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId);
671 if(lynq_apn_table[apnId].hasTimeout==1)
672 {
673 /*whether timeout?,real or not,*/
674 printf_apn_table();
675 LYERRLOG("apn:%s has time out,deacive this apn",lynq_apn_table[apnId].apn);
676 if (NULL != lynq_apn_table[apnId].apn && NULL != lynq_apn_table[apnId].apnType && strlen(lynq_apn_table[apnId].apn)>0)
677 {
678 LYERRLOG("deactive this time out APN");
679 lynq_deactive_data_call(&apnId);
680 }
681 else
682 {
683 /*if apn lose,update apn and deactive all apn*/
684 LYERRLOG("this table is invalid update APN table");
685 }
686 break;
687 }
688 updateApnTable(&lynq_apn_table[apnId],apn,apnType,ifaceName);
689 printf_apn_table_debug(__FUNCTION__,__LINE__);
690 }
691 /*To be completed*/
692 else
693 {
694 data_invaild_error = 1;
695 printf_apn_table_debug(__FUNCTION__,__LINE__);
696 apnId = getDeactApnID(apnType);
697 if(apnId < 0)
698 {
699 LYERRLOG("[%d]invalid apnId:%d",__LINE__,apnId);
700 break;
701 }
702 LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId);
703 updateDeactApn(apnId,pdnState);
704 printf_apn_table_debug(__FUNCTION__,__LINE__);
705 }
706 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
707 s_data_urc_wait_list.push_back(apnId);
708 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
709 lynq_data_call_change_id = apnId;
710 sendSignalPdnChange();
711 LYDBGLOG("data call state:%d",lynq_data_call);
712 if(lynq_data_call==1)
713 {
714 while (data_timelimit == 0)
715 {
716 LYINFLOG("client not ready to wait");
717 for (check_count = 0;check_count < 500;check_count++)
718 {
719 /*wait 10ms*/
720 usleep(10*1000);
721 }
722 LYERRLOG("client still without res");
723 break;
724 }
725 if(pdnState == RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL)
726 {
727 lynq_data_call = LYNQ_E_TIME_OUT;
728 }
729 else
730 {
731 lynq_data_call = 0;
732 }
733 sendSignalDataCallStateChange();
734 data_timelimit = 0;
735 }
736 printf_apn_table_debug(__FUNCTION__,__LINE__);
737 }
738 else
739 {
740 urc_msg = strdupReadString_p(p);
741 free(urc_msg);
742 urc_msg = strdupReadString_p(p);
743 len = strlen(urc_msg);
744 if(len < LYNQ_APN_TYPE_MAX_LEN-1)
745 {
746 memcpy(apnType,urc_msg,len+1);
747 }
748 free(urc_msg);
749 LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType);
750 apnId = getLynqApnID(apnType);
751 if(apnId >= 0)
752 {
753 LYINFLOG("[%d]URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",__LINE__,apnType,ifaceName,apn,pdnState,apnId);
754 lynq_data_call_change_id = apnId;
755 //bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
756 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
757 s_data_urc_wait_list.push_back(apnId);
758 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
759 sendSignalPdnChange();
760 }
761 else
762 {
763 apnId = getDeactApnID(apnType);
764 if(apnId < 0)
765 {
766 LYERRLOG("[%d]invalid apnId:%d",__LINE__,apnId);
767 break;
768 }
769 LYINFLOG("[%d]URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",__LINE__,apnType,ifaceName,apn,pdnState,apnId);
770 cleanDeactApn(apnId);
771 lynq_data_call_change_id = apnId;
772 bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
773 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
774 s_data_urc_wait_list.push_back(apnId);
775 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
776 sendSignalDeactvied();
777 sendSignalPdnChange();
778 printf_apn_table_debug(__FUNCTION__,__LINE__);
779 }
780 LYDBGLOG("data call state:%d",lynq_data_call);
781 if(lynq_data_call==1)
782 {
783 while (data_timelimit == 0)
784 {
785 LYINFLOG("client not ready to wait");
786 for (check_count = 0;check_count < 500;check_count++)
787 {
788 /*wait 10ms*/
789 usleep(10*1000);
790 }
791 LYERRLOG("client still without res");
792 break;
793 }
794 sendSignalDataCallStateChange();
795 lynq_data_call = 0;
796 data_timelimit = 0;
797 }
798 printf_apn_table_debug(__FUNCTION__,__LINE__);
799 }
800 break;
801 case LYNQ_URC_MODIFY_APNDB:
802 urc_msg = strdupReadString_p(p);
803 if (NULL == urc_msg)
804 {
805 LYERRLOG("error apn msg");
806 }
807 else
808 {
809 bzero(g_lynq_apn_result, 1024);
810 strcpy(g_lynq_apn_result, urc_msg);
811 sendSignalApnChange();
812 }
813 free(urc_msg);
814 break;
815 case LYNQ_URC_RESET_APNDB:
816 {
817 urc_msg = strdupReadString_p(p);
818 if (NULL == urc_msg)
819 {
820 LYERRLOG("error apn msg");
821 }
822 else
823 {
824 bzero(g_lynq_apn_result, 1024);
825 strcpy(g_lynq_apn_result, urc_msg);
826 sendSignalApnChange();
827 }
828 free(urc_msg);
829 break;
830 }
831 case LYNQ_TELEPHONY_RESTART:
832 {
833 if(slot_id == 0)
834 {
835 RLOGI("data has received telephony has restart");
836 RLOGI("handle set to 10");
837 lynq_telephony_restart_g = 1;
838 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
839 s_data_urc_wait_list.push_back(TELEPHONY_RESTART);
840 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
841 sendSignalPdnChange();
842 }
843 break;
844 }
845 default:
846 break;
847 }
848
849}
850
851int create_urc_vector_signal_thread()
852{
853 int ret;
854 pthread_mutex_init(&s_lynq_urc_vector_mutex,NULL);
855 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
856 s_data_urc_wait_list.clear();
857 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
858 return 0;
859}
860int get_imsi();
861int check_apn_status();
862
863int get_timeout_value();
864int lynq_init_data(int uToken)
865{
866 LYLOGSET(LOG_INFO);
867 LYLOGEINIT(USER_LOG_TAG);
868 LYERRLOG("%s start, parameter is %d", __func__,uToken);
869
870 if (g_lynq_data_init_flag == 1)
871 {
872 LYERRLOG("init twice is not allowed");
873 return -1;
874 }
875 g_lynq_data_init_flag = 1;
876 int result = 0;
877 Global_uToken = uToken;
878
879 int ret = get_timeout_value();
880 if(ret >= 30000)
881 {
882 g_data_call_timeout_value = ret;
883 }
884 else
885 {
886 LYERRLOG("timeout must greater or equal to 30s!!!");
887 }
888 result = lynq_socket_client_start();
889 pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
890 if(result!=0)
891 {
892 LYERRLOG("init socket client fail!!!");
893 return -1;
894 }
895 result = lynq_init_data_urc_thread();
896 if(result!=0)
897 {
898 LYERRLOG("init socket urc fail!!!");
899 return -1;
900 }
901
902 result = create_urc_vector_signal_thread();
903 if(result!=0)
904 {
905 LYERRLOG("init socket urc fail!!!");
906 return -1;
907 }
908 memset(lynq_apn_table,0,sizeof(lynq_apn_table));
909 LYINFLOG("[%s] radio on/off solution 20230724",__FUNCTION__);
910 int count = 0;
911 while(count < 2)//try recover the network within 10s.
912 {
913 result = check_apn_status();
914 if(result==0)
915 {
916 break;
917 }
918 radio_switch(0);
919 sleep(1);
920 radio_switch(1);
921 sleep(3);
922 count++;
923 }
924 LYINFLOG("[%s] count is %d",__FUNCTION__,count);
925 if(result!=0)
926 {
927 LYDBGLOG("lynq init call fail!!!");
928 return LYNQ_E_MD_NOT_READY;//
929 }
930 /* old
931 while(count < 10)
932 {
933 result = get_imsi();
934 if(result==0)
935 {
936 break;
937 }
938 sleep(1);
939 count++;
940 }
941 LYINFLOG("[%s] count is %d",__FUNCTION__,count);
942 if(result!=0)
943 {
944 LYDBGLOG("lynq init call fail!!!");
945 return LYNQ_E_MD_NOT_READY;//
946 }
947 */
948 LYERRLOG("%s end suc", __func__);
949 return 0;
950
951}
952int lynq_deinit_data()
953{
954 LYERRLOG("%s start", __func__);
955
956 int ret = -1;
957 if (g_lynq_data_init_flag == 0)
958 {
959 LYERRLOG("deinit twice is not allowed");
960 return ret;
961 }
962 g_lynq_data_init_flag = 0;
963 for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++)
964 {
965 if(strlen(lynq_apn_table[i].apnType)!=0)
966 {
967 lynq_deactive_data_call(&i);
968 }
969 }
970 if(lynq_client_sockfd>0)
971 {
972 close(lynq_client_sockfd);
973 }
974 ret = lynq_deinit_data_urc_thread();
975 if (ret != 0)
976 {
977 LYERRLOG("lynq_deinit_data_urc_thread fail");
978 return ret;
979 }
980 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
981 s_data_urc_wait_list.clear();
982 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
983 LYERRLOG("%s end suc", __func__);
984 return 0;
985}
986int lynq_setup_data_call(int *handle)
987{
988 int error = -1;
989 if (g_lynq_data_init_flag == 0)
990 {
991 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
992 return error;
993 }
994 #ifdef GSW_RIL_CFG //becuase gsw not have connman,data can not be triggered by connman.
995 LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
996 error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL);
997 #else
998 Parcel *p = NULL;
999 lynq_client_t client;
1000 int resp_type = -1;
1001 int request = -1;
1002 int slot_id = -1;
1003 int lynq_data_call_id = 0;
1004 if(handle==NULL)
1005 {
1006 LYERRLOG("handle is null!!!");
1007 return LYNQ_E_NULL_ANONALY;
1008 }
1009 client.uToken = get_utoken();
1010 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
1011 client.paramLen = 0;
1012 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1013 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1014 lynq_data_call_id = get_handle("default");
1015 if (lynq_data_call_id < 0)
1016 {
1017 LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
1018 return LYNQ_E_NULL_ANONALY+1;
1019 }
1020 *handle = lynq_data_call_id;//T8TSK-211 (2023/5/16) why? If it times out, the client application will also try to reconnect.
1021 //Reconnection needs to be deactivated first, and deactivation needs to know which apn to activate.
1022 lynq_data_call = 1;
1023 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1024 if(send_request(lynq_client_sockfd,&client)==-1)
1025 {
1026 LYERRLOG("send request fail");
1027 perror("[LYNQ_DATA] send request fail:");
1028 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1029 return LYNQ_E_NULL_ANONALY+2;
1030 }
1031 //get_response(lynq_client_sockfd,p);
1032 error = wait_response(lynq_client_sockfd,p,client.uToken);
1033 if(error!=0)
1034 {
1035 LYERRLOG("wait_response fail,ret:%d",error);
1036 printf_apn_table_debug(__FUNCTION__,__LINE__);
1037 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1038 return error;
1039 }
1040 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1041 JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
1042 free_parcel(p);
1043 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1044 if(error==0)
1045 {
1046 data_timelimit = 1;
1047 if (waitDataCallstateChange(g_data_call_timeout_value) == ETIMEDOUT)
1048 {
1049 error = LYNQ_E_TIME_OUT;
1050 LYERRLOG("timeout:wait data Call state fail!!!");
1051 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
1052 if (data_invaild_error == 1)
1053 {
1054 data_invaild_error = 0;
1055 LYERRLOG("urc apn info error!!!");
1056 return 8085;
1057 }
1058 printf_apn_table_debug(__FUNCTION__,__LINE__);
1059 return error;
1060 }
1061 if(lynq_data_call == LYNQ_E_TIME_OUT)
1062 {
1063 error = LYNQ_E_TIME_OUT;
1064 LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
1065 printf_apn_table_debug(__FUNCTION__,__LINE__);
1066 return error;
1067 }
1068 }
1069 printf_apn_table_debug(__FUNCTION__,__LINE__);
1070 #endif //GSW_RIL_CFG
1071 return error;
1072}
1073
you.chen0a869ea2024-01-24 14:02:41 +08001074void deactiveAfterTimeout(int apnId)
1075{
1076 LYDBGLOG("%s:apn id:%d",__FUNCTION__,apnId);
1077 cleanDeactApn(apnId);
1078 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
1079 s_data_urc_wait_list.push_back(apnId);
1080 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
1081 sendSignalPdnChange();
1082}
you.chen5ef374a2023-12-26 17:25:16 +08001083int lynq_deactive_data_call(int *handle)
1084{
1085 Parcel *p = NULL;
1086 lynq_client_t client;
1087 int resp_type = -1;
1088 int request = -1;
1089 int slot_id = -1;
1090 int error = -1;
1091 int lynq_data_call_id = -1;
1092 int ret = 0;
1093 if (g_lynq_data_init_flag == 0)
1094 {
1095 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
1096 return error;
1097 }
1098 if(handle==NULL)
1099 {
1100 LYERRLOG("handle is null!!!");
1101 return -1;
1102 }
1103 ret = handleCheck(*handle);
1104 if (ret != 0)
1105 {
1106 LYERRLOG("incomming handle is invalid");
1107 return -1;
1108 }
1109 lynq_data_call_id = *handle;
1110 client.uToken = get_utoken();
1111 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
1112 client.paramLen = 0;
1113 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1114 #ifdef GSW_RIL_CFG
1115 client.paramLen = 1;
1116 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
1117 #else
1118 if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")!=0)
1119 {
1120 client.paramLen = 1;
1121 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
1122 }
1123 #endif //GSW_RIL_CFG
1124 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1125 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1126 if(send_request(lynq_client_sockfd,&client)==-1)
1127 {
1128 LYERRLOG("send request fail");
1129 perror("[LYNQ_DATA] send request fail:");
1130 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1131 return -1;
1132 }
1133 //get_response(lynq_client_sockfd,p);
1134 error = wait_response(lynq_client_sockfd,p,client.uToken);
1135 if(error!=0)
1136 {
1137 LYERRLOG("wait_response fail,ret:%d",error);
1138 printf_apn_table_debug(__FUNCTION__,__LINE__);
1139 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1140 return error;
1141 }
1142 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1143 JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
1144 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1145 cleanOnceApnTable(lynq_data_call_id);
1146 printf_apn_table_debug(__FUNCTION__,__LINE__);
1147 if(error==0)
1148 {
1149 if(waitDeactived(20000)==ETIMEDOUT)
1150 {
1151 error = LYNQ_E_TIME_OUT;
1152 LYERRLOG("[lynq_deactive_data_call] timeout:wait data Call state fail!!!");
you.chen0a869ea2024-01-24 14:02:41 +08001153 deactiveAfterTimeout(lynq_data_call_id);
you.chen5ef374a2023-12-26 17:25:16 +08001154 printf_apn_table_debug(__FUNCTION__,__LINE__);
1155 }
1156 }
1157 free_parcel(p);
1158 return error;
1159}
1160int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)
1161{
1162 Parcel *p = NULL;
1163 lynq_client_t client;
1164 int resp_type = -1;
1165 int request = -1;
1166 int slot_id = -1;
1167 int error = -1;
1168 int lynq_data_call_id = -1;
1169 char *argv[10] = {};
1170 if (g_lynq_data_init_flag == 0)
1171 {
1172 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
1173 return error;
1174 }
1175 #ifdef GSW_RIL_CFG
1176 LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
1177 if(handle==NULL||apnType==NULL)
1178 {
1179 LYERRLOG("handle or apntype is null!!!");
1180 return -1;
1181 }
1182 #else
1183 if(handle==NULL||apn==NULL||apnType==NULL)
1184 {
1185 LYERRLOG("handle ,apn or apntype is null!!!");
1186 return LYNQ_E_NULL_ANONALY;
1187 }
1188 #endif //GSW_RIL_CFG
1189 if(user==NULL)
1190 {
1191 argv[1] = "null";
1192 }
1193 else
1194 {
1195 argv[1] = user;
1196 }
1197 if(password==NULL)
1198 {
1199 argv[2] = "null";
1200 }
1201 else
1202 {
1203 argv[2] = password;
1204 }
1205 if(authType==NULL)
1206 {
1207 argv[3] = "null";
1208 }
1209 else
1210 {
1211 argv[3] = authType;
1212 }
1213 if(normalProtocol==NULL)
1214 {
1215 argv[4] = "null";
1216 }
1217 else
1218 {
1219 argv[4] = normalProtocol;
1220 }
1221 if(roamingProtocol==NULL)
1222 {
1223 argv[5] = "null";
1224 }
1225 else
1226 {
1227 argv[5] = roamingProtocol;
1228 }
1229 client.uToken = get_utoken();
1230 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
1231 client.paramLen = 7;
1232 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1233 #ifdef GSW_RIL_CFG
1234 if(NULL == apn)
1235 {
1236 sprintf(client.param,"null %s %s %s %s %s %s",apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
1237 }
1238 else
1239 {
1240 sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
1241 }
1242 #else
1243 sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
1244 #endif //GSW_RIL_CFG
1245 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1246 lynq_data_call_id = get_handle(apnType);
1247 if (lynq_data_call_id < 0)
1248 {
1249 LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
1250 return LYNQ_E_NULL_ANONALY+1;
1251 }
1252 *handle = lynq_data_call_id;//T8TSK-211 (2023/5/16)
1253 lynq_data_call = 1;
1254 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1255 if(send_request(lynq_client_sockfd,&client)==-1)
1256 {
1257 LYERRLOG("send request fail");
1258 perror("[LYNQ_DATA] send request fail:");
1259 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1260 return LYNQ_E_NULL_ANONALY+2;
1261 }
1262 //get_response(lynq_client_sockfd,p);
1263 error = wait_response(lynq_client_sockfd,p,client.uToken);
1264 if(error!=0)
1265 {
1266 LYERRLOG("wait_response fail,ret:%d",error);
1267 printf_apn_table_debug(__FUNCTION__,__LINE__);
1268 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1269 return error;
1270 }
1271 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1272 JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
1273 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1274 free_parcel(p);
1275 if(error==0)
1276 {
1277 data_timelimit = 1;
1278 if(waitDataCallstateChange(g_data_call_timeout_value)==ETIMEDOUT)
1279 {
1280 error = LYNQ_E_TIME_OUT;
1281 LYERRLOG("timeout:wait data Call state fail!!!");
1282 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
1283 if (data_invaild_error == 1)
1284 {
1285 data_invaild_error = 0;
1286 LYERRLOG("urc apn info error!!!");
1287 return 8085;
1288 }
1289 printf_apn_table_debug(__FUNCTION__,__LINE__);
1290 return error;
1291 }
1292 if(lynq_data_call == LYNQ_E_TIME_OUT)
1293 {
1294 error = LYNQ_E_TIME_OUT;
1295 LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
1296 printf_apn_table_debug(__FUNCTION__,__LINE__);
1297 return error;
1298 }
1299 }
1300 printf_apn_table_debug(__FUNCTION__,__LINE__);
1301 return error;
1302}
1303/*
1304int lynq_deactive_data_call_sp(int *handle,char *apnType)
1305{
1306 Parcel p;
1307 lynq_client_t client;
1308 int resp_type = -1;
1309 int request = -1;
1310 int slot_id = -1;
1311 int error = -1;
1312 if(handle==NULL||apnType==NULL)
1313 {
1314 LYERRLOG("handle is null!!!");
1315 return -1;
1316 }
1317 client.uToken = Global_uToken;
1318 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
1319 client.paramLen = 1;
1320 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1321 sprintf(client.param,"%s",apnType);
1322 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1323 if(send_request(lynq_client_sockfd,&client)==-1)
1324 {
1325 LYERRLOG("send request fail");
1326 perror("[LYNQ_DATA] send request fail:");
1327 return -1;
1328 }
1329 get_response(lynq_client_sockfd,p);
1330 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1331 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1332 return error;
1333}
1334*/
1335int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)
1336{
1337 Parcel *p = NULL;
1338 lynq_client_t client;
1339 int resp_type = -1;
1340 int token;
1341 int request = -1;
1342 int slot_id = -1;
1343 int error = -1;
1344 int version =0;
1345 int num = 0;
1346 char *temp_char = NULL;
1347 if(dataCallList==NULL)
1348 {
1349 LYERRLOG("dataCallList is null!!!");
1350 return -1;
1351 }
1352 client.uToken = get_utoken();;
1353 client.request = 57;//RIL_REQUEST_DATA_CALL_LIST
1354 client.paramLen = 0;
1355 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1356 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1357 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1358 if(send_request(lynq_client_sockfd,&client)==-1)
1359 {
1360 LYERRLOG("send request fail");
1361 perror("[LYNQ_DATA] send request fail:");
1362 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1363 return -1;
1364 }
1365 //get_response(lynq_client_sockfd,p);
1366 error = wait_response(lynq_client_sockfd,p,client.uToken);
1367 if(error!=0)
1368 {
1369 LYERRLOG("wait_response fail,ret:%d",error);
1370 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1371 return error;
1372 }
1373 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1374 if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
1375 {
1376 LYERRLOG("JumpHeader fail");
1377 return -1;
1378 }
1379 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1380 p->readInt32(&version);
1381 if(version==11)
1382 {
1383 p->readInt32(&num);
1384 *realNum = num;
1385 for (int i = 0; i < num; i++)
1386 {
1387 p->readInt32(&dataCallList[i].status);
1388 p->readInt32(&dataCallList[i].suggestedRetryTime);
1389 p->readInt32(&dataCallList[i].cid);
1390 p->readInt32(&dataCallList[i].active);
1391 temp_char = strdupReadString_p(p);
1392 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1393 if(temp_char)
1394 {
1395 memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);
1396 free(temp_char);
1397 }
1398 temp_char = strdupReadString_p(p);
1399 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1400 if(temp_char)
1401 {
1402 memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);
1403 free(temp_char);
1404 }
1405 temp_char = strdupReadString_p(p);
1406 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1407 if(temp_char)
1408 {
1409 memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);
1410 free(temp_char);
1411 }
1412 temp_char = strdupReadString_p(p);
1413 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1414 if(temp_char)
1415 {
1416 memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);
1417 free(temp_char);
1418 }
1419 temp_char = strdupReadString_p(p);
1420 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1421 if(temp_char)
1422 {
1423 memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);
1424 free(temp_char);
1425 }
1426 temp_char = strdupReadString_p(p);
1427 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1428 if(temp_char)
1429 {
1430 memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);
1431 free(temp_char);
1432 }
1433 p->readInt32(&dataCallList[i].mtu);
1434 }
1435 }
1436 free_parcel(p);
1437 return error;
1438}
1439
1440int lynq_get_apn_msg(int handle,lynq_apn_msg_t *apn_msg)
1441{
1442 LYINFLOG("[lynq_get_apn_msg] enter,handle:%d",handle);
1443 if((handle < 0) || (handle > 6) || (NULL == apn_msg))
1444 {
1445 LYERRLOG("handle value error,or apn_msg is null");
1446 return LYNQ_E_NULL_ANONALY;
1447 }
1448 apn_msg->handle = handle;
1449 if(apn_msg->apn!=NULL)
1450 {
1451 memcpy(apn_msg->apn,lynq_apn_table[handle].apn,LYNQ_APN_MAX_LEN);
1452 }
1453 if(apn_msg->apnType!=NULL)
1454 {
1455 memcpy(apn_msg->apnType,lynq_apn_table[handle].apnType,LYNQ_APN_TYPE_MAX_LEN);
1456 }
1457 return 0;
1458}
1459
1460int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList)
1461{
1462 lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};
1463 int number = 0;
1464 int lynq_data_call_id = 0;
1465 int error = 0;
1466 if (g_lynq_data_init_flag == 0)
1467 {
1468 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
1469 return -1;
1470 }
1471 lynq_data_call_id = *handle;
1472 if((handle==NULL) || (dataCallList==NULL))
1473 {
1474 LYERRLOG("[lynq_get_data_call_list] handle or datacalllist is NULL");
1475 return LYNQ_E_NULL_ANONALY;
1476 }
1477 if ((*handle < 0) || (*handle > 6))
1478 {
1479 LYERRLOG("[lynq_get_data_call_list] handle value error");
1480 return LYNQ_E_NULL_ANONALY;
1481 }
1482 LYINFLOG("[lynq_get_data_call_list] incoming handle value: %d",*handle);
1483 memset(interDataCallList,0,sizeof(interDataCallList));
1484 error = getDataCallLists(interDataCallList,&number);
1485 if(error == 0)
1486 {
1487 for(int i = 0;i < number;i++)
1488 {
1489 if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)
1490 {
1491 dataCallList->active = interDataCallList[i].active;
1492 dataCallList->suggestedRetryTime = interDataCallList[i].suggestedRetryTime;
1493 dataCallList->cid = interDataCallList[i].cid;
1494 dataCallList->status = interDataCallList[i].status;
1495 dataCallList->mtu = interDataCallList[i].mtu;
1496 memcpy(dataCallList->addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));
1497 memcpy(dataCallList->ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));
1498 memcpy(dataCallList->dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));
1499 memcpy(dataCallList->type,interDataCallList[i].type,sizeof(interDataCallList[i].type));
1500 memcpy(dataCallList->gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));
1501 memcpy(dataCallList->pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));
1502 LYDBGLOG("ifname:%s,addr:%s",dataCallList->ifname,dataCallList->addresses);
1503 }
1504 }
1505 }
1506 return error;
1507}
1508int lynq_wait_data_call_state_change(int *handle)
1509{
1510 if (data_waiting_status == 1)
1511 {
1512 LYDBGLOG("some thread is waiting");
1513 return -3;
1514 }
1515 LYDBGLOG("is empty :%d",s_data_urc_wait_list.empty());
1516 if (s_data_urc_wait_list.empty())
1517 {
1518 LYDBGLOG("start wait");
1519 data_waiting_status = 1;
1520 waitPdnChange();
1521 }
1522 data_waiting_status = 0;
1523 std::vector<int>::iterator iter;
1524
1525 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
1526 iter = s_data_urc_wait_list.begin();
1527 if (iter != s_data_urc_wait_list.end())
1528 {
1529 *handle = *iter;
1530 }
1531 s_data_urc_wait_list.erase(iter);
1532 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
1533
1534 LYINFLOG("lynq_wait_data_call_state_change handle:%d",*handle);
1535 return 0;
1536}
1537/*Warren add for T800 platform 2021/11/19 end*/
1538
1539/*Typethree add for T800 platform 2022/04/21 start*/
1540
1541int insert_apn_char(char *agc, char *id,char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier)
1542{
1543 char strtmp[10][32];
1544 if (id == NULL)
1545 {
1546 sprintf(strtmp[0], "id=;");
1547 }
1548 else
1549 {
1550 sprintf(strtmp[0], "id=%s;", id);
1551 }
1552 if (mcc == NULL)
1553 {
1554 sprintf(strtmp[1], "mcc=;");
1555 }
1556 else
1557 {
1558 sprintf(strtmp[1], "mcc=%s;", mcc);
1559 }
1560 if (mnc == NULL)
1561 {
1562 sprintf(strtmp[2], "mnc=;");
1563 }
1564 else
1565 {
1566 sprintf(strtmp[2], "mnc=%s;", mnc);
1567 }
1568 if (apn == NULL)
1569 {
1570 sprintf(strtmp[3], "apn=;");
1571 }
1572 else
1573 {
1574 sprintf(strtmp[3], "apn=%s;", apn);
1575 }
1576 if (apntype == NULL)
1577 {
1578 sprintf(strtmp[4], "apntype=;");
1579 }
1580 else
1581 {
1582 sprintf(strtmp[4], "apntype=%s;", apntype);
1583 }
1584 if (user == NULL)
1585 {
1586 sprintf(strtmp[5], "user=;");
1587 }
1588 else
1589 {
1590 sprintf(strtmp[5], "user=%s;", user);
1591 }
1592 if (password == NULL)
1593 {
1594 sprintf(strtmp[6], "password=;");
1595 }
1596 else
1597 {
1598 sprintf(strtmp[6], "password=%s;", password);
1599 }
1600 if (normalprotocol == NULL)
1601 {
1602 sprintf(strtmp[7], "normalprotocol=;");
1603 }
1604 else
1605 {
1606 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1607 }
1608 if (roamingprotocol == NULL)
1609 {
1610 sprintf(strtmp[8], "roamingprotocol=;");
1611 }
1612 else
1613 {
1614 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1615 }
1616 if (carrier == NULL)
1617 {
1618 sprintf(strtmp[9], "carrier=;");
1619 }
1620 else
1621 {
1622 sprintf(strtmp[9], "carrier=%s;", carrier);
1623 }
1624 sprintf(agc, "%s%s%s%s%s%s%s%s%s%s",strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]);
1625
1626 return 0;
1627}
1628
1629int modify_apn_char(char *agc, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier)
1630{
1631 char strtmp[10][32];
1632 if (id == NULL)
1633 {
1634 sprintf(strtmp[0], "id=;");
1635 }
1636 else
1637 {
1638 sprintf(strtmp[0], "id=%s;", id);
1639 }
1640 if (mcc == NULL)
1641 {
1642 sprintf(strtmp[1], "mcc=;");
1643 }
1644 else
1645 {
1646 sprintf(strtmp[1], "mcc=%s;", mcc);
1647 }
1648 if (mnc == NULL)
1649 {
1650 sprintf(strtmp[2], "mnc=;");
1651 }
1652 else
1653 {
1654 sprintf(strtmp[2], "mnc=%s;", mnc);
1655 }
1656 if (apn == NULL)
1657 {
1658 sprintf(strtmp[3], "apn=;");
1659 }
1660 else
1661 {
1662 sprintf(strtmp[3], "apn=%s;", apn);
1663 }
1664 if (apntype == NULL)
1665 {
1666 sprintf(strtmp[4], "apntype=;");
1667 }
1668 else
1669 {
1670 sprintf(strtmp[4], "apntype=%s;", apntype);
1671 }
1672 if (user == NULL)
1673 {
1674 sprintf(strtmp[5], "user=;");
1675 }
1676 else
1677 {
1678 sprintf(strtmp[5], "user=%s;", user);
1679 }
1680 if (password == NULL)
1681 {
1682 sprintf(strtmp[6], "password=;");
1683 }
1684 else
1685 {
1686 sprintf(strtmp[6], "password=%s;", password);
1687 }
1688 if (normalprotocol == NULL)
1689 {
1690 sprintf(strtmp[7], "normalprotocol=;");
1691 }
1692 else
1693 {
1694 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1695 }
1696 if (roamingprotocol == NULL)
1697 {
1698 sprintf(strtmp[8], "roamingprotocol=;");
1699 }
1700 else
1701 {
1702 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1703 }
1704 if (carrier == NULL)
1705 {
1706 sprintf(strtmp[9], "carrier=;");
1707 }
1708 else
1709 {
1710 sprintf(strtmp[9], "carrier=%s;", carrier);
1711 }
1712 sprintf(agc, "%s%s%s%s%s%s%s%s%s%s", strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]);
1713 return 0;
1714}
1715
1716
1717int query_apn_char(char *agc, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier)
1718{
1719 char strtmp[10][32];
1720 if (id == NULL)
1721 {
1722 sprintf(strtmp[0], "");
1723 }
1724 else
1725 {
1726 sprintf(strtmp[0], "id=%s;", id);
1727 }
1728 if (mcc == NULL)
1729 {
1730 sprintf(strtmp[1], "");
1731 }
1732 else
1733 {
1734 sprintf(strtmp[1], "mcc=%s;", mcc);
1735 }
1736 if (mnc == NULL)
1737 {
1738 sprintf(strtmp[2], "");
1739 }
1740 else
1741 {
1742 sprintf(strtmp[2], "mnc=%s;", mnc);
1743 }
1744 if (apn == NULL)
1745 {
1746 sprintf(strtmp[3], "");
1747 }
1748 else
1749 {
1750 sprintf(strtmp[3], "apn=%s;", apn);
1751 }
1752 if (apntype == NULL)
1753 {
1754 sprintf(strtmp[4], "");
1755 }
1756 else
1757 {
1758 sprintf(strtmp[4], "apntype=%s;", apntype);
1759 }
1760 if (user == NULL)
1761 {
1762 sprintf(strtmp[5], "");
1763 }
1764 else
1765 {
1766 sprintf(strtmp[5], "user=%s;", user);
1767 }
1768 if (password == NULL)
1769 {
1770 sprintf(strtmp[6], "");
1771 }
1772 else
1773 {
1774 sprintf(strtmp[6], "password=%s;", password);
1775 }
1776 if (normalprotocol == NULL)
1777 {
1778 sprintf(strtmp[7], "");
1779 }
1780 else
1781 {
1782 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1783 }
1784 if (roamingprotocol == NULL)
1785 {
1786 sprintf(strtmp[8], "");
1787 }
1788 else
1789 {
1790 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1791 }
1792 if (carrier == NULL)
1793 {
1794 sprintf(strtmp[9], "");
1795 }
1796 else
1797 {
1798 sprintf(strtmp[9], "carrier=%s;", carrier);
1799 }
1800 sprintf(agc, "%s%s%s%s%s%s%s%s%s%s", strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]);
1801 return 0;
1802}
1803
1804static char *lynqStrdupReadString(Parcel &p)
1805{
1806 size_t stringlen;
1807 const char16_t *s16;
1808
1809 s16 = p.readString16Inplace(&stringlen);
1810 return strndup16to8(s16, stringlen);
1811}
1812int get_imsi()
1813{
1814 Parcel *p =NULL;
1815 lynq_client_t client;
1816 int resp_type = -1;
1817 int token;
1818 int request = -1;
1819 int slot_id = -1;
1820 int error = -1;
1821 int version =0;
1822 int num = 0;
1823 char *temp_char = NULL;
1824 char mccmnc[32] = {0};
1825 char mccmnckey[64] = {0};
1826 client.uToken = get_utoken();
1827 client.request = 11;//RIL_REQUEST_GET_IMSI 11
1828 client.paramLen = 0;
1829 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1830 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1831 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1832 if(send_request(lynq_client_sockfd,&client)==-1)
1833 {
1834 LYERRLOG("send request fail");
1835 perror("[LYNQ_DATA] send request fail:");
1836 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1837 return -1;
1838 }
1839 //get_response(lynq_client_sockfd,p);
1840 error = wait_response(lynq_client_sockfd,p,client.uToken);
1841 if(error!=0)
1842 {
1843 LYERRLOG("wait_response fail,ret:%d",error);
1844 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1845 return error;
1846 }
1847 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1848 if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
1849 {
1850 LYERRLOG("JumpHeader fail");
1851 return -1;
1852 }
1853 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1854 if(error == 0)
1855 {
1856 char * test = strdupReadString_p(p);
1857 memcpy(mccmnc, test,5);
1858 mccmnc[5]='\0';
1859 free(test);
1860 sprintf(mccmnckey,"uci set radio_property.property.vendor_ril_data_gsm_mcc_mnc0=%s",mccmnc);
1861 system(mccmnckey);
1862 system("uci commit");
1863 }
1864 free_parcel(p);
1865 return error;
1866}
1867int lynq_modify_apn_db(const int cmd, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier, char *out)
1868{
1869 if (NULL == id && NULL == mcc && NULL == mnc && NULL == apn && NULL == apntype && NULL == user && NULL == password && NULL == normalprotocol && NULL == roamingprotocol && NULL == carrier)
1870 {
1871 LYERRLOG("There are no valid parameters");
1872 return -1;
1873 }
1874 lynq_client_t client;
1875 char argc[512];
1876 int res = -1;
1877 if (cmd == 0) // insert apn db
1878 {
1879 res = insert_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
1880 client.uToken = get_utoken();
1881 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1882 client.paramLen = 2;
1883 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1884 sprintf(client.param, "%d %s", cmd, argc);
1885 }
1886 else if (cmd == 1) //delete apn db
1887 {
1888 if (NULL == id)
1889 {
1890 LYERRLOG("id is NULL!!!please input id: ");
1891 }
1892 sprintf(argc, "id=%s", id);
1893 client.uToken = get_utoken();
1894 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1895 client.paramLen = 2;
1896 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1897 sprintf(client.param, "%d %s", cmd, argc);
1898 }
1899 else if (cmd == 2) //query apn db
1900 {
1901 query_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
1902 client.uToken = get_utoken();
1903 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1904 client.paramLen = 2;
1905 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1906 sprintf(client.param, "%d %s", cmd, argc);
1907 }
1908 else if (cmd == 3) //modify apn db
1909 {
1910 modify_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
1911 client.uToken = get_utoken();
1912 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1913 client.paramLen = 2;
1914 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1915 sprintf(client.param, "%d %s", cmd, argc);
1916 }
1917 else
1918 {
1919 LYERRLOG("incoming command is invalid");
1920 return -1;
1921 }
1922 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1923 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1924 if(send_request(lynq_client_sockfd,&client)==-1)
1925 {
1926 LYERRLOG("send request fail");
1927 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1928 return -1;
1929 }
1930 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1931 waitApnResult();
1932 strcpy(out, g_lynq_apn_result);
1933 LYINFLOG(">>>>>output info:%s",out);
1934 return 0;
1935}
1936
1937int lynq_reset_apn(char *result)
1938{
1939 lynq_client_t client;
1940 if (NULL == result)
1941 {
1942 LYERRLOG("incoming paramters error");
1943 }
1944 client.uToken = get_utoken();
1945 client.request = 2000 + 194;
1946 client.paramLen = 0;
1947 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1948 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s", client.uToken, client.request, client.paramLen, client.param);
1949 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1950 if (send_request(lynq_client_sockfd, &client) == -1)
1951 {
1952 LYERRLOG("send request fail");
1953 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1954 return -1;
1955 }
1956 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1957 waitApnResult();
1958 strcpy(result, g_lynq_apn_result);
1959 LYINFLOG(">>>>>result:%s",result);
1960 return 0;
1961}
1962
1963/*Typethree add for T800 platform 2022/04/21 end*/
1964static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
1965 FILE *fp;
1966 //printf("to exec cmd:%s\n", str_cmd);
1967 if((fp=popen(str_cmd,"r"))==NULL)
1968 {
1969 perror("popen error!");
1970 return -1;
1971 }
1972 if((fread(str_cmd_ret,max_len,1,fp))<0)
1973 {
1974 perror("fread fail!");
1975 fclose(fp);
1976 return -1;
1977 }
1978 fclose(fp);
1979 return 0;
1980}
1981int check_apn_status()
1982{
1983 LYINFLOG("check_apn_status enter");
1984 int ret = -1;
1985 char cmd_ret[8] ={0};//get mccmnc
1986 const char *cmd = "uci get radio_property.property.vendor_ril_data_gsm_mcc_mnc0";
1987 const char *empty_str = ":empty";
1988 ret = exec_cmd(cmd,cmd_ret,8);
1989 if(ret==0)
1990 {
1991 if(strlen(cmd_ret)==0)
1992 {
1993 LYERRLOG("not have mccmnc config in uci ram");
1994 return 1;
1995 }
1996 if(strncmp(cmd_ret,empty_str,strlen(empty_str))==0)
1997 {
1998 LYERRLOG("mccmnc is empty");
1999 return 2;
2000 }
2001 LYINFLOG("mccmnc is %s",cmd_ret);
2002 return 0;
2003 }
2004 else
2005 {
2006 LYERRLOG("exec cmd fail");
2007 return -1;
2008 }
2009 return 0;
2010}
2011int get_timeout_value()
2012{
2013 LYINFLOG("get_timeout_value enter");
2014 int ret = -1;
2015 char timeout_value[8] ={0};//get get_timeout_value
2016 ret = lynq_get_value("lynq_uci","data_call","timeout",timeout_value);
2017 if(ret == 0)
2018 {
2019 LYINFLOG("data_call.timeout is %s",timeout_value);
2020 return atoi(timeout_value);
2021 }
2022 else
2023 {
2024 LYERRLOG("get_timeout_value");
2025 return -1;
2026 }
2027}
2028
2029int radio_switch(int status)
2030{
2031 Parcel *p =NULL;
2032 lynq_client_t client;
2033 int resp_type = -1;
2034 int token;
2035 int request = -1;
2036 int slot_id = -1;
2037 int error = -1;
2038 int version =0;
2039 int num = 0;
2040 char *temp_char = NULL;
2041 char mccmnc[32] = {0};
2042 char mccmnckey[64] = {0};
2043 client.uToken = get_utoken();
2044 client.request = 59;//RIL_REQUEST_OEM_HOOK_RAW 59
2045 client.paramLen = 1;
2046 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
2047 sprintf(client.param,"AT+CFUN=%d",status);
2048 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
2049 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
2050 if(send_request(lynq_client_sockfd,&client)==-1)
2051 {
2052 LYERRLOG("send request fail");
2053 perror("[LYNQ_DATA] send request fail:");
2054 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
2055 return -1;
2056 }
2057 //get_response(lynq_client_sockfd,p);
2058 error = wait_response(lynq_client_sockfd,p,client.uToken);
2059 if(error!=0)
2060 {
2061 LYERRLOG("wait_response fail,ret:%d",error);
2062 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
2063 return error;
2064 }
2065 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
2066 if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
2067 {
2068 LYERRLOG("JumpHeader fail");
2069 return -1;
2070 }
2071 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
2072 free_parcel(p);
2073 return error;
2074}