blob: 7f39860b77a3f7b92e01f6dda93f510bdd15f637 [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>
rjw0cdacbc2022-06-22 10:51:07 +080016#include <include/lynq_uci.h>
rjw747deea2022-07-01 18:25:30 +080017#include <errno.h>
rjw7ee7bb42023-01-18 11:34:28 +080018#include <vector>
19#include "lynq_data_urc.h"
20
lhf81a46f2022-02-13 23:57:37 -080021#define LYNQ_SERVICE_PORT 8088
lh8d290112023-10-22 20:53:06 -070022#define LYNQ_RIL_FWK_IP "127.0.0.1"
23
lhf81a46f2022-02-13 23:57:37 -080024#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
rjw0cdacbc2022-06-22 10:51:07 +080029#define LYNQ_DATA_UCI_BUF 258
Hong_Liu25edfe72023-06-16 01:13:42 -070030#define LYNQ_DATA_TIME_OUT 1000*120
xy.hef5d74f12023-10-23 06:48:52 -070031#define TELEPHONY_RESTART 10
Hong_Liu7163bbe2023-06-04 03:03:44 -070032
rjw61fcae32022-08-18 14:03:39 +080033
lhf81a46f2022-02-13 23:57:37 -080034using ::android::Parcel;
35typedef struct{
36 int uToken;
37 int request;
38 int paramLen;
39 char param[LYNQ_REQUEST_PARAM_BUF];
40}lynq_client_t;
lh13586612022-01-11 21:58:58 -080041typedef 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,
Hong_Liu25edfe72023-06-16 01:13:42 -070055 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,
lh13586612022-01-11 21:58:58 -080059 /* The logic conflict*/
60 LYNQ_E_CONFLICT=9000,
61 /*Null anomaly*/
62 LYNQ_E_NULL_ANONALY=9001
lhf81a46f2022-02-13 23:57:37 -080063}LYNQ_E;
64
lha62e0882023-10-31 05:17:11 -070065typedef 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
lhf81a46f2022-02-13 23:57:37 -080077int lynq_client_sockfd = 0;
78int Global_uToken = 0;
Hong_Liu7e1b85e2023-05-16 05:51:57 -070079struct sockaddr_in lynq_data_socket_server_addr;
80int lynq_data_socket_server_addr_len;
rjw7ee7bb42023-01-18 11:34:28 +080081
lhf81a46f2022-02-13 23:57:37 -080082int lynq_data_call_change_id = -1;
xy.hef5d74f12023-10-23 06:48:52 -070083int lynq_telephony_restart_g = 0;
lhf81a46f2022-02-13 23:57:37 -080084pthread_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;
rjw7ee7bb42023-01-18 11:34:28 +080087
Hong_Liu25edfe72023-06-16 01:13:42 -070088static 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
rjw20006d12022-04-21 16:29:04 +080092static pthread_mutex_t s_lynq_apn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
93static pthread_cond_t s_lynq_apn_change_cond = PTHREAD_COND_INITIALIZER;
rjw7ee7bb42023-01-18 11:34:28 +080094static pthread_mutex_t s_lynq_urc_vector_mutex = PTHREAD_MUTEX_INITIALIZER;
95static pthread_cond_t s_lynq_urc_vector_cond = PTHREAD_COND_INITIALIZER;
rjwed00d042022-05-25 09:18:16 +080096/**g_lynq_data_sendto_mutex
97* @brief mark data send request mutex
98*/
99static pthread_mutex_t g_lynq_data_sendto_mutex;
rjwf9ec3832023-04-12 10:59:15 +0800100/*This value data the state of the wait*/
rjwc3d6e582023-03-28 17:19:11 +0800101static int data_waiting_status = 0;
rjwf9ec3832023-04-12 10:59:15 +0800102/*The value indicates that 8085 error occurs in data*/
rjwc63abb42023-03-31 18:22:42 +0800103static int data_invaild_error = 0;
rjwf9ec3832023-04-12 10:59:15 +0800104/*This value ensure the data call timing is correct*/
105static int data_timelimit = 0;
rjwc63abb42023-03-31 18:22:42 +0800106
rjw22947c22022-03-15 09:21:29 +0800107/**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;
rjw20006d12022-04-21 16:29:04 +0800113/**g_lynq_apn_result
114* @brief temp of apn result info
115*/
116char g_lynq_apn_result[1024] = {};
lha62e0882023-10-31 05:17:11 -0700117int g_data_call_timeout_value = LYNQ_DATA_TIME_OUT;
rjw747deea2022-07-01 18:25:30 +0800118
rjw7ee7bb42023-01-18 11:34:28 +0800119static std::vector<int> s_data_urc_wait_list;
120
rjw20006d12022-04-21 16:29:04 +0800121typedef struct
122{
lhf81a46f2022-02-13 23:57:37 -0800123 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;
Hong_Liudc46d412023-05-18 13:36:26 -0700128 int status;
129 char statusApnType[LYNQ_APN_TYPE_MAX_LEN];
lhf81a46f2022-02-13 23:57:37 -0800130}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;
lhf81a46f2022-02-13 23:57:37 -0800134
xy.hef5d74f12023-10-23 06:48:52 -0700135int radio_switch(int status);
136
lhf81a46f2022-02-13 23:57:37 -0800137int getLynqApnID(char apnType[])
138{
139 int ret = 0;
rjwc63abb42023-03-31 18:22:42 +0800140 int len = 0;
lhf81a46f2022-02-13 23:57:37 -0800141 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
142 {
Hong_Liudc46d412023-05-18 13:36:26 -0700143 len = strlen(apnType);
Hong_Liu6149f182023-05-12 02:15:14 -0700144 LYINFLOG("apn_table[%d].apnType:%s,input apntype:%s,len:%d",ret,lynq_apn_table[ret].apnType,apnType,len);
rjwc63abb42023-03-31 18:22:42 +0800145 if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0)
lh13586612022-01-11 21:58:58 -0800146 {
lhf81a46f2022-02-13 23:57:37 -0800147 return ret;
148 }
149 }
150 return -1;
151}
rjw7ee7bb42023-01-18 11:34:28 +0800152
Hong_Liudc46d412023-05-18 13:36:26 -0700153int 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
lhf81a46f2022-02-13 23:57:37 -0800169void 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}
rjw7ee7bb42023-01-18 11:34:28 +0800184
lhf81a46f2022-02-13 23:57:37 -0800185void cleanOnceApnTable(int apnId)
186{
Hong_Liudc46d412023-05-18 13:36:26 -0700187 LYDBGLOG("%s:apn id:%d",__FUNCTION__,apnId);
lhf81a46f2022-02-13 23:57:37 -0800188 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;
Hong_Liudc46d412023-05-18 13:36:26 -0700195 memcpy(lynq_apn_table[apnId].statusApnType,lynq_apn_table[apnId].apnType,strlen(lynq_apn_table[apnId].apnType));
lhf81a46f2022-02-13 23:57:37 -0800196 bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);
Hong_Liudc46d412023-05-18 13:36:26 -0700197 bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
lhf81a46f2022-02-13 23:57:37 -0800198 bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
Hong_Liudc46d412023-05-18 13:36:26 -0700199 lynq_apn_table[apnId].status = 32;
lhf81a46f2022-02-13 23:57:37 -0800200 return;
201}
Hong_Liudc46d412023-05-18 13:36:26 -0700202void 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
lhf81a46f2022-02-13 23:57:37 -0800226int getUnusedElement()
227{
Hong_Liudc46d412023-05-18 13:36:26 -0700228 if (lynq_apn_table == NULL)
229 {
230 LYERRLOG("get UnusedElemnt apn_table is null");
231 return -1;
232 }
lhf81a46f2022-02-13 23:57:37 -0800233 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 }
rjwc63abb42023-03-31 18:22:42 +0800240 LYERRLOG("None of get unused Element");
lhf81a46f2022-02-13 23:57:37 -0800241 return -1;
242}
243int updateApn(char apnType[])
244{
245 int ret = 0;
246 ret = getUnusedElement();
Hong_Liu55668712023-05-16 21:49:17 -0700247 if(ret >= 0)
Hong_Liu7e1b85e2023-05-16 05:51:57 -0700248 {
249 memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);
250 lynq_apn_table[ret].hasUsed = 1;
251 }
lhf81a46f2022-02-13 23:57:37 -0800252 return ret;
253}
Hong_Liu55c62f52023-08-24 19:05:50 -0700254//@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}
rjw1309e232022-07-22 09:54:06 +0800284
285int handleCheck(int handle)
286{
Hong_Liu7163bbe2023-06-04 03:03:44 -0700287 if ((handle >= 0) && (handle <= 6))
rjw1309e232022-07-22 09:54:06 +0800288 {
Hong_Liu7163bbe2023-06-04 03:03:44 -0700289 if (lynq_apn_table[handle].hasUsed == 1)
290 {
291 return 0;
292 }
rjw1309e232022-07-22 09:54:06 +0800293 return -1;
294 }
Hong_Liu7163bbe2023-06-04 03:03:44 -0700295 return -1;
rjw1309e232022-07-22 09:54:06 +0800296}
rjw20006d12022-04-21 16:29:04 +0800297int 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}
lhf81a46f2022-02-13 23:57:37 -0800324
325int waitPdnChange()
326{
327 int ret = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800328 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);
lhf81a46f2022-02-13 23:57:37 -0800331 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}
Hong_Liu25edfe72023-06-16 01:13:42 -0700357int 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
lhf81a46f2022-02-13 23:57:37 -0800382void sendSignalPdnChange()
383{
rjw7ee7bb42023-01-18 11:34:28 +0800384 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);
lhf81a46f2022-02-13 23:57:37 -0800387 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 */
Hong_Liu7e1b85e2023-05-16 05:51:57 -0700396 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);
rjw08528682022-07-04 21:28:02 +0800398 if(len == -1)
lhf81a46f2022-02-13 23:57:37 -0800399 {
Hong_Liu7e1b85e2023-05-16 05:51:57 -0700400 LYERRLOG("get_response fail,errno:%d",errno);
lhf81a46f2022-02-13 23:57:37 -0800401 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}
Hong_Liu25edfe72023-06-16 01:13:42 -0700409/**@brief get utoken in range 0 to 10000
410* @return utoken
411*/
412int get_utoken()
lhf81a46f2022-02-13 23:57:37 -0800413{
Hong_Liu25edfe72023-06-16 01:13:42 -0700414 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?
lhf81a46f2022-02-13 23:57:37 -0800436 {
Hong_Liu25edfe72023-06-16 01:13:42 -0700437 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);
lhf81a46f2022-02-13 23:57:37 -0800501 return 0;
502 }
503 else
504 {
505 return -1;
506 }
507}
Hong_Liu25edfe72023-06-16 01:13:42 -0700508void free_parcel(Parcel *p)
509{
510 if(p)
511 {
512 delete p;
513 p = NULL;
514 }
515}
lhf81a46f2022-02-13 23:57:37 -0800516int send_request(int sockfd,lynq_client_t *client_tmp)
517{
518 int ret=0;
lh8d290112023-10-22 20:53:06 -0700519 ret = sendto(sockfd,client_tmp,LYQN_SEDN_BUF,0,(struct sockaddr *)&lynq_data_socket_server_addr,lynq_data_socket_server_addr_len);
lhf81a46f2022-02-13 23:57:37 -0800520 if(ret==-1)
521 {
lh8d290112023-10-22 20:53:06 -0700522 LYERRLOG("%s:errno code:%d",__FUNCTION__,errno);
lhf81a46f2022-02-13 23:57:37 -0800523 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
lhf81a46f2022-02-13 23:57:37 -0800540/*Warren add for T800 platform 2021/11/19 start*/
541int lynq_socket_client_start()
542{
lh8d290112023-10-22 20:53:06 -0700543 int ret;
544 struct timeval timeOut;
545 struct sockaddr_in liblynq_data_socket;
rjw747deea2022-07-01 18:25:30 +0800546
lh8d290112023-10-22 20:53:06 -0700547 ret = 0;
rjwa59bf312022-07-05 11:50:31 +0800548 timeOut.tv_sec = 30;
rjw747deea2022-07-01 18:25:30 +0800549 timeOut.tv_usec = 0;
lh8d290112023-10-22 20:53:06 -0700550 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);
rjw747deea2022-07-01 18:25:30 +0800556
lh8d290112023-10-22 20:53:06 -0700557 //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 }
rjw747deea2022-07-01 18:25:30 +0800570 if (setsockopt(lynq_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
571 {
lh8d290112023-10-22 20:53:06 -0700572 LYERRLOG("time out setting failed,errno:%d",errno);
lhf81a46f2022-02-13 23:57:37 -0800573 return -1;
574 }
575 return 0;
576}
rjw7ee7bb42023-01-18 11:34:28 +0800577
578bool is_support_urc(int urc_id)
lhf81a46f2022-02-13 23:57:37 -0800579{
rjw7ee7bb42023-01-18 11:34:28 +0800580 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:
xy.hef5d74f12023-10-23 06:48:52 -0700586 case LYNQ_TELEPHONY_RESTART:
rjw7ee7bb42023-01-18 11:34:28 +0800587 return true;
588 default:
589 return false;
590 }
591}
592
rjwc63abb42023-03-31 18:22:42 +0800593int printf_apn_table()
594{
595 int ret = 0;
Hong_Liu6149f182023-05-12 02:15:14 -0700596 if (lynq_apn_table == NULL)
597 {
598 LYERRLOG("apn table is null");
599 return -1;
600 }
rjwc63abb42023-03-31 18:22:42 +0800601 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
602 {
Hong_Liudc46d412023-05-18 13:36:26 -0700603 LYINFLOG("[%s][%d] apn=%s ;apntype=%s ;ifname=%s ;hasTimeout = %d ; hasUsed = %d,status = %d,statusDeactApn = %s",__FUNCTION__,ret, \
rjwc63abb42023-03-31 18:22:42 +0800604 lynq_apn_table[ret].apn,lynq_apn_table[ret].apnType,lynq_apn_table[ret].ifaceName, \
Hong_Liudc46d412023-05-18 13:36:26 -0700605 lynq_apn_table[ret].hasTimeout,lynq_apn_table[ret].hasUsed,lynq_apn_table[ret].status,lynq_apn_table[ret].statusApnType);
rjwc63abb42023-03-31 18:22:42 +0800606 }
607 return 0;
608}
609
Hong_Liu6149f182023-05-12 02:15:14 -0700610void printf_apn_table_debug(const char *fun,int line)
611{
612 LYINFLOG("[%s][%d]apn_table msg",fun,line);
613 printf_apn_table();
614}
rjwc63abb42023-03-31 18:22:42 +0800615
rjw7ee7bb42023-01-18 11:34:28 +0800616void urc_msg_process(Parcel *p)
617{
618 int len;
619 int resp_type;
620 int urcid;
621 int slot_id;
rjwf9ec3832023-04-12 10:59:15 +0800622 int check_count = 0;
Hong_Liudc46d412023-05-18 13:36:26 -0700623 static int apnId=-1;
rjw7ee7bb42023-01-18 11:34:28 +0800624
625 int pdnState = 0;
lhf81a46f2022-02-13 23:57:37 -0800626 char apn[LYNQ_APN_MAX_LEN];
627 char apnType[LYNQ_APN_TYPE_MAX_LEN];
lhf81a46f2022-02-13 23:57:37 -0800628 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
lhf81a46f2022-02-13 23:57:37 -0800629 char *urc_msg = NULL;
rjw7ee7bb42023-01-18 11:34:28 +0800630
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)
lhf81a46f2022-02-13 23:57:37 -0800637 {
rjw7ee7bb42023-01-18 11:34:28 +0800638 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);
lha62e0882023-10-31 05:17:11 -0700643 if(pdnState != RIL_Data_Call_PdnState::PDN_DISCONNECTED)//PDN_DISCONNECTED
lhf81a46f2022-02-13 23:57:37 -0800644 {
rjw20006d12022-04-21 16:29:04 +0800645 urc_msg = strdupReadString_p(p);
rjw7ee7bb42023-01-18 11:34:28 +0800646 int len = strlen(urc_msg);
Hong_Liu6149f182023-05-12 02:15:14 -0700647 if((len < LYNQ_APN_MAX_LEN-1) && (len > 0))
rjw20006d12022-04-21 16:29:04 +0800648 {
rjw7ee7bb42023-01-18 11:34:28 +0800649 memcpy(apn,urc_msg,len+1);
rjw20006d12022-04-21 16:29:04 +0800650 }
Hong_Liu6149f182023-05-12 02:15:14 -0700651 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800652 urc_msg = strdupReadString_p(p);
653 len = strlen(urc_msg);
Hong_Liu6149f182023-05-12 02:15:14 -0700654 if((len < LYNQ_APN_TYPE_MAX_LEN-1) && (len > 0))
rjw7ee7bb42023-01-18 11:34:28 +0800655 {
656 memcpy(apnType,urc_msg,len+1);
657 }
Hong_Liu6149f182023-05-12 02:15:14 -0700658 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800659 urc_msg = strdupReadString_p(p);
660 len = strlen(urc_msg);
Hong_Liu6149f182023-05-12 02:15:14 -0700661 if((len < LYNQ_IFACE_NAME_MAX_LEN-1) && (len > 0))
rjw7ee7bb42023-01-18 11:34:28 +0800662 {
663 memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
664 }
Hong_Liu6149f182023-05-12 02:15:14 -0700665 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800666 //sendSignalDataCallStateChange();
Hong_Liudc46d412023-05-18 13:36:26 -0700667 apnId = getLynqApnID(apnType);
rjw7ee7bb42023-01-18 11:34:28 +0800668 if(apnId >= 0)
669 {
Hong_Liudc46d412023-05-18 13:36:26 -0700670 LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId);
rjw7ee7bb42023-01-18 11:34:28 +0800671 if(lynq_apn_table[apnId].hasTimeout==1)
672 {
rjwc63abb42023-03-31 18:22:42 +0800673 /*whether timeout?,real or not,*/
674 printf_apn_table();
rjw7ee7bb42023-01-18 11:34:28 +0800675 LYERRLOG("apn:%s has time out,deacive this apn",lynq_apn_table[apnId].apn);
rjw3938f262023-03-08 16:09:28 +0800676 if (NULL != lynq_apn_table[apnId].apn && NULL != lynq_apn_table[apnId].apnType && strlen(lynq_apn_table[apnId].apn)>0)
rjw7ee7bb42023-01-18 11:34:28 +0800677 {
678 LYERRLOG("deactive this time out APN");
679 lynq_deactive_data_call(&apnId);
680 }
rjwc63abb42023-03-31 18:22:42 +0800681 else
rjw7ee7bb42023-01-18 11:34:28 +0800682 {
rjwc63abb42023-03-31 18:22:42 +0800683 /*if apn lose,update apn and deactive all apn*/
684 LYERRLOG("this table is invalid update APN table");
rjw7ee7bb42023-01-18 11:34:28 +0800685 }
686 break;
687 }
rjwacdb2152023-02-07 14:12:49 +0800688 updateApnTable(&lynq_apn_table[apnId],apn,apnType,ifaceName);
Hong_Liu6149f182023-05-12 02:15:14 -0700689 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw7ee7bb42023-01-18 11:34:28 +0800690 }
691 /*To be completed*/
rjw20006d12022-04-21 16:29:04 +0800692 else
693 {
Hong_Liu6149f182023-05-12 02:15:14 -0700694 data_invaild_error = 1;
Hong_Liudc46d412023-05-18 13:36:26 -0700695 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__);
rjw20006d12022-04-21 16:29:04 +0800705 }
rjw7ee7bb42023-01-18 11:34:28 +0800706 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;
rjwc3d6e582023-03-28 17:19:11 +0800710 sendSignalPdnChange();
rjw7ee7bb42023-01-18 11:34:28 +0800711 LYDBGLOG("data call state:%d",lynq_data_call);
712 if(lynq_data_call==1)
713 {
rjwf9ec3832023-04-12 10:59:15 +0800714 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 }
lha62e0882023-10-31 05:17:11 -0700725 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 }
rjw7ee7bb42023-01-18 11:34:28 +0800733 sendSignalDataCallStateChange();
rjwf9ec3832023-04-12 10:59:15 +0800734 data_timelimit = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800735 }
Hong_Liu6149f182023-05-12 02:15:14 -0700736 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw20006d12022-04-21 16:29:04 +0800737 }
rjw7ee7bb42023-01-18 11:34:28 +0800738 else
rjw20006d12022-04-21 16:29:04 +0800739 {
rjw7ee7bb42023-01-18 11:34:28 +0800740 urc_msg = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -0700741 free(urc_msg);
742 urc_msg = strdupReadString_p(p);
rjw7ee7bb42023-01-18 11:34:28 +0800743 len = strlen(urc_msg);
744 if(len < LYNQ_APN_TYPE_MAX_LEN-1)
745 {
746 memcpy(apnType,urc_msg,len+1);
747 }
Hong_Liu6149f182023-05-12 02:15:14 -0700748 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800749 LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType);
Hong_Liudc46d412023-05-18 13:36:26 -0700750 apnId = getLynqApnID(apnType);
rjw7ee7bb42023-01-18 11:34:28 +0800751 if(apnId >= 0)
752 {
Hong_Liu8d77acf2023-08-30 02:11:09 -0700753 LYINFLOG("[%d]URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",__LINE__,apnType,ifaceName,apn,pdnState,apnId);
Hong_Liudc46d412023-05-18 13:36:26 -0700754 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 }
Hong_Liu8d77acf2023-08-30 02:11:09 -0700769 LYINFLOG("[%d]URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",__LINE__,apnType,ifaceName,apn,pdnState,apnId);
Hong_Liudc46d412023-05-18 13:36:26 -0700770 cleanDeactApn(apnId);
rjw7ee7bb42023-01-18 11:34:28 +0800771 lynq_data_call_change_id = apnId;
772 bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
rjw3938f262023-03-08 16:09:28 +0800773 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);
Hong_Liu25edfe72023-06-16 01:13:42 -0700776 sendSignalDeactvied();
rjwc3d6e582023-03-28 17:19:11 +0800777 sendSignalPdnChange();
Hong_Liudc46d412023-05-18 13:36:26 -0700778 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw7ee7bb42023-01-18 11:34:28 +0800779 }
rjw7ee7bb42023-01-18 11:34:28 +0800780 LYDBGLOG("data call state:%d",lynq_data_call);
781 if(lynq_data_call==1)
782 {
rjwf9ec3832023-04-12 10:59:15 +0800783 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 }
rjw7ee7bb42023-01-18 11:34:28 +0800794 sendSignalDataCallStateChange();
795 lynq_data_call = 0;
rjwf9ec3832023-04-12 10:59:15 +0800796 data_timelimit = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800797 }
Hong_Liu6149f182023-05-12 02:15:14 -0700798 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw7ee7bb42023-01-18 11:34:28 +0800799 }
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 }
Hong_Liu6149f182023-05-12 02:15:14 -0700813 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800814 break;
815 case LYNQ_URC_RESET_APNDB:
816 {
rjw20006d12022-04-21 16:29:04 +0800817 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 }
Hong_Liu6149f182023-05-12 02:15:14 -0700828 free(urc_msg);
xy.heac05ee02023-11-29 14:36:31 +0800829 break;
rjw20006d12022-04-21 16:29:04 +0800830 }
xy.hef5d74f12023-10-23 06:48:52 -0700831 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);
xy.hef5d74f12023-10-23 06:48:52 -0700841 sendSignalPdnChange();
842 }
xy.heac05ee02023-11-29 14:36:31 +0800843 break;
xy.hef5d74f12023-10-23 06:48:52 -0700844 }
rjw7ee7bb42023-01-18 11:34:28 +0800845 default:
846 break;
lhf81a46f2022-02-13 23:57:37 -0800847 }
rjw7ee7bb42023-01-18 11:34:28 +0800848
lhf81a46f2022-02-13 23:57:37 -0800849}
rjw7ee7bb42023-01-18 11:34:28 +0800850
rjw7ee7bb42023-01-18 11:34:28 +0800851int create_urc_vector_signal_thread()
852{
853 int ret;
rjw7ee7bb42023-01-18 11:34:28 +0800854 pthread_mutex_init(&s_lynq_urc_vector_mutex,NULL);
rjw7ee7bb42023-01-18 11:34:28 +0800855 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
856 s_data_urc_wait_list.clear();
857 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
lhf81a46f2022-02-13 23:57:37 -0800858 return 0;
859}
Hong_Liu25edfe72023-06-16 01:13:42 -0700860int get_imsi();
Hong_Liu7d9ac8d2023-07-24 00:40:31 -0700861int check_apn_status();
xy.hef5d74f12023-10-23 06:48:52 -0700862
lha62e0882023-10-31 05:17:11 -0700863int get_timeout_value();
lhf81a46f2022-02-13 23:57:37 -0800864int lynq_init_data(int uToken)
865{
q.huangf6a9ddc2023-12-08 20:23:56 +0800866 LYLOGSET(LOG_INFO);
867 LYLOGEINIT(USER_LOG_TAG);
868 LYERRLOG("%s start, parameter is %d", __func__,utoken);
869
rjw22947c22022-03-15 09:21:29 +0800870 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;
lhf81a46f2022-02-13 23:57:37 -0800876 int result = 0;
877 Global_uToken = uToken;
q.huangf6a9ddc2023-12-08 20:23:56 +0800878
lha62e0882023-10-31 05:17:11 -0700879 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 }
lhf81a46f2022-02-13 23:57:37 -0800888 result = lynq_socket_client_start();
rjwed00d042022-05-25 09:18:16 +0800889 pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
lhf81a46f2022-02-13 23:57:37 -0800890 if(result!=0)
891 {
892 LYERRLOG("init socket client fail!!!");
893 return -1;
894 }
rjw7ee7bb42023-01-18 11:34:28 +0800895 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();
lhf81a46f2022-02-13 23:57:37 -0800903 if(result!=0)
904 {
905 LYERRLOG("init socket urc fail!!!");
906 return -1;
907 }
908 memset(lynq_apn_table,0,sizeof(lynq_apn_table));
Hong_Liu7d9ac8d2023-07-24 00:40:31 -0700909 LYINFLOG("[%s] radio on/off solution 20230724",__FUNCTION__);
Hong_Liu25edfe72023-06-16 01:13:42 -0700910 int count = 0;
Hong_Liu7d9ac8d2023-07-24 00:40:31 -0700911 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
Hong_Liu25edfe72023-06-16 01:13:42 -0700931 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 }
Hong_Liu7d9ac8d2023-07-24 00:40:31 -0700947 */
q.huangf6a9ddc2023-12-08 20:23:56 +0800948 LYERRLOG("%s end suc", __func__);
lhf81a46f2022-02-13 23:57:37 -0800949 return 0;
950
951}
952int lynq_deinit_data()
953{
q.huangf6a9ddc2023-12-08 20:23:56 +0800954 LYERRLOG("%s start", __func__);
955
956 int ret = -1;
rjw22947c22022-03-15 09:21:29 +0800957 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;
lhf81a46f2022-02-13 23:57:37 -0800963 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 }
rjw7ee7bb42023-01-18 11:34:28 +0800974 ret = lynq_deinit_data_urc_thread();
rjweb65a2f2023-02-01 16:43:23 +0800975 if (ret != 0)
rjw22947c22022-03-15 09:21:29 +0800976 {
rjw7ee7bb42023-01-18 11:34:28 +0800977 LYERRLOG("lynq_deinit_data_urc_thread fail");
978 return ret;
rjw22947c22022-03-15 09:21:29 +0800979 }
rjwc3d6e582023-03-28 17:19:11 +0800980 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
981 s_data_urc_wait_list.clear();
982 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
q.huangf6a9ddc2023-12-08 20:23:56 +0800983 LYERRLOG("%s end suc", __func__);
lhf81a46f2022-02-13 23:57:37 -0800984 return 0;
985}
986int lynq_setup_data_call(int *handle)
987{
Hong_Liue54db8c2023-04-21 02:37:23 -0700988 int error = -1;
lha62e0882023-10-31 05:17:11 -0700989 if (g_lynq_data_init_flag == 0)
990 {
991 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
992 return error;
993 }
Hong_Liue54db8c2023-04-21 02:37:23 -0700994 #ifdef GSW_RIL_CFG //becuase gsw not have connman,data can not be triggered by connman.
995 LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
Hong_Liue9879152023-04-25 20:40:26 -0700996 error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL);
Hong_Liue54db8c2023-04-21 02:37:23 -0700997 #else
Hong_Liu25edfe72023-06-16 01:13:42 -0700998 Parcel *p = NULL;
lhf81a46f2022-02-13 23:57:37 -0800999 lynq_client_t client;
1000 int resp_type = -1;
1001 int request = -1;
1002 int slot_id = -1;
lhf81a46f2022-02-13 23:57:37 -08001003 int lynq_data_call_id = 0;
1004 if(handle==NULL)
1005 {
1006 LYERRLOG("handle is null!!!");
1007 return LYNQ_E_NULL_ANONALY;
1008 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001009 client.uToken = get_utoken();
lhf81a46f2022-02-13 23:57:37 -08001010 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);
Hong_Liu55c62f52023-08-24 19:05:50 -07001014 lynq_data_call_id = get_handle("default");
rjwc63abb42023-03-31 18:22:42 +08001015 if (lynq_data_call_id < 0)
1016 {
1017 LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001018 return LYNQ_E_NULL_ANONALY+1;
rjwc63abb42023-03-31 18:22:42 +08001019 }
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001020 *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.
rjw733b9832023-04-03 10:20:08 +08001022 lynq_data_call = 1;
rjwed00d042022-05-25 09:18:16 +08001023 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -08001024 if(send_request(lynq_client_sockfd,&client)==-1)
1025 {
1026 LYERRLOG("send request fail");
1027 perror("[LYNQ_DATA] send request fail:");
Hong_Liu25edfe72023-06-16 01:13:42 -07001028 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001029 return LYNQ_E_NULL_ANONALY+2;
lhf81a46f2022-02-13 23:57:37 -08001030 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001031 //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 }
rjwed00d042022-05-25 09:18:16 +08001040 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liuaa7f4b32023-07-19 07:51:25 -07001041 JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
Hong_Liu25edfe72023-06-16 01:13:42 -07001042 free_parcel(p);
lhf81a46f2022-02-13 23:57:37 -08001043 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lhf81a46f2022-02-13 23:57:37 -08001044 if(error==0)
1045 {
rjwf9ec3832023-04-12 10:59:15 +08001046 data_timelimit = 1;
lha62e0882023-10-31 05:17:11 -07001047 if (waitDataCallstateChange(g_data_call_timeout_value) == ETIMEDOUT)
lhf81a46f2022-02-13 23:57:37 -08001048 {
1049 error = LYNQ_E_TIME_OUT;
1050 LYERRLOG("timeout:wait data Call state fail!!!");
1051 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
Hong_Liu6149f182023-05-12 02:15:14 -07001052 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__);
lhf81a46f2022-02-13 23:57:37 -08001059 return error;
1060 }
lha62e0882023-10-31 05:17:11 -07001061 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 }
lhf81a46f2022-02-13 23:57:37 -08001068 }
Hong_Liu6149f182023-05-12 02:15:14 -07001069 printf_apn_table_debug(__FUNCTION__,__LINE__);
Hong_Liue54db8c2023-04-21 02:37:23 -07001070 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -08001071 return error;
1072}
rjw7ee7bb42023-01-18 11:34:28 +08001073
lhf81a46f2022-02-13 23:57:37 -08001074int lynq_deactive_data_call(int *handle)
1075{
Hong_Liu25edfe72023-06-16 01:13:42 -07001076 Parcel *p = NULL;
lhf81a46f2022-02-13 23:57:37 -08001077 lynq_client_t client;
1078 int resp_type = -1;
1079 int request = -1;
1080 int slot_id = -1;
1081 int error = -1;
1082 int lynq_data_call_id = -1;
rjw1309e232022-07-22 09:54:06 +08001083 int ret = 0;
lha62e0882023-10-31 05:17:11 -07001084 if (g_lynq_data_init_flag == 0)
1085 {
1086 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
1087 return error;
1088 }
lhf81a46f2022-02-13 23:57:37 -08001089 if(handle==NULL)
1090 {
1091 LYERRLOG("handle is null!!!");
1092 return -1;
1093 }
rjw1309e232022-07-22 09:54:06 +08001094 ret = handleCheck(*handle);
1095 if (ret != 0)
1096 {
1097 LYERRLOG("incomming handle is invalid");
1098 return -1;
1099 }
1100 lynq_data_call_id = *handle;
Hong_Liu25edfe72023-06-16 01:13:42 -07001101 client.uToken = get_utoken();
lhf81a46f2022-02-13 23:57:37 -08001102 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
Hong_Liue3d35262023-05-04 00:20:12 -07001103 client.paramLen = 0;
1104 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1105 #ifdef GSW_RIL_CFG
1106 client.paramLen = 1;
1107 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
1108 #else
1109 if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")!=0)
lh13586612022-01-11 21:58:58 -08001110 {
lhf81a46f2022-02-13 23:57:37 -08001111 client.paramLen = 1;
lhf81a46f2022-02-13 23:57:37 -08001112 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
1113 }
Hong_Liue3d35262023-05-04 00:20:12 -07001114 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -08001115 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwed00d042022-05-25 09:18:16 +08001116 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -08001117 if(send_request(lynq_client_sockfd,&client)==-1)
1118 {
1119 LYERRLOG("send request fail");
1120 perror("[LYNQ_DATA] send request fail:");
Hong_Liu25edfe72023-06-16 01:13:42 -07001121 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -08001122 return -1;
1123 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001124 //get_response(lynq_client_sockfd,p);
1125 error = wait_response(lynq_client_sockfd,p,client.uToken);
1126 if(error!=0)
1127 {
1128 LYERRLOG("wait_response fail,ret:%d",error);
1129 printf_apn_table_debug(__FUNCTION__,__LINE__);
1130 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1131 return error;
1132 }
rjwed00d042022-05-25 09:18:16 +08001133 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu25edfe72023-06-16 01:13:42 -07001134 JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
1135 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
lhf81a46f2022-02-13 23:57:37 -08001136 cleanOnceApnTable(lynq_data_call_id);
Hong_Liu6149f182023-05-12 02:15:14 -07001137 printf_apn_table_debug(__FUNCTION__,__LINE__);
Hong_Liu25edfe72023-06-16 01:13:42 -07001138 if(error==0)
1139 {
1140 if(waitDeactived(20000)==ETIMEDOUT)
1141 {
1142 error = LYNQ_E_TIME_OUT;
1143 LYERRLOG("[lynq_deactive_data_call] timeout:wait data Call state fail!!!");
1144 printf_apn_table_debug(__FUNCTION__,__LINE__);
1145 }
1146 }
1147 free_parcel(p);
lhf81a46f2022-02-13 23:57:37 -08001148 return error;
1149}
1150int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)
1151{
Hong_Liu25edfe72023-06-16 01:13:42 -07001152 Parcel *p = NULL;
lhf81a46f2022-02-13 23:57:37 -08001153 lynq_client_t client;
1154 int resp_type = -1;
1155 int request = -1;
1156 int slot_id = -1;
1157 int error = -1;
lhf81a46f2022-02-13 23:57:37 -08001158 int lynq_data_call_id = -1;
1159 char *argv[10] = {};
lha62e0882023-10-31 05:17:11 -07001160 if (g_lynq_data_init_flag == 0)
1161 {
1162 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
1163 return error;
1164 }
Hong_Liue54db8c2023-04-21 02:37:23 -07001165 #ifdef GSW_RIL_CFG
1166 LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
1167 if(handle==NULL||apnType==NULL)
1168 {
1169 LYERRLOG("handle or apntype is null!!!");
1170 return -1;
1171 }
1172 #else
lhf81a46f2022-02-13 23:57:37 -08001173 if(handle==NULL||apn==NULL||apnType==NULL)
1174 {
1175 LYERRLOG("handle ,apn or apntype is null!!!");
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001176 return LYNQ_E_NULL_ANONALY;
lhf81a46f2022-02-13 23:57:37 -08001177 }
Hong_Liue54db8c2023-04-21 02:37:23 -07001178 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -08001179 if(user==NULL)
1180 {
1181 argv[1] = "null";
1182 }
1183 else
1184 {
1185 argv[1] = user;
lh13586612022-01-11 21:58:58 -08001186 }
1187 if(password==NULL)
1188 {
lhf81a46f2022-02-13 23:57:37 -08001189 argv[2] = "null";
lh13586612022-01-11 21:58:58 -08001190 }
1191 else
1192 {
lhf81a46f2022-02-13 23:57:37 -08001193 argv[2] = password;
lh13586612022-01-11 21:58:58 -08001194 }
1195 if(authType==NULL)
1196 {
lhf81a46f2022-02-13 23:57:37 -08001197 argv[3] = "null";
lh13586612022-01-11 21:58:58 -08001198 }
1199 else
1200 {
lhf81a46f2022-02-13 23:57:37 -08001201 argv[3] = authType;
lh13586612022-01-11 21:58:58 -08001202 }
1203 if(normalProtocol==NULL)
1204 {
lhf81a46f2022-02-13 23:57:37 -08001205 argv[4] = "null";
lh13586612022-01-11 21:58:58 -08001206 }
1207 else
1208 {
lhf81a46f2022-02-13 23:57:37 -08001209 argv[4] = normalProtocol;
lh13586612022-01-11 21:58:58 -08001210 }
1211 if(roamingProtocol==NULL)
1212 {
lhf81a46f2022-02-13 23:57:37 -08001213 argv[5] = "null";
lh13586612022-01-11 21:58:58 -08001214 }
1215 else
1216 {
lhf81a46f2022-02-13 23:57:37 -08001217 argv[5] = roamingProtocol;
1218 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001219 client.uToken = get_utoken();
lhf81a46f2022-02-13 23:57:37 -08001220 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
1221 client.paramLen = 7;
1222 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
Hong_Liue54db8c2023-04-21 02:37:23 -07001223 #ifdef GSW_RIL_CFG
1224 if(NULL == apn)
1225 {
1226 sprintf(client.param,"null %s %s %s %s %s %s",apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
1227 }
1228 else
1229 {
1230 sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
1231 }
1232 #else
lhf81a46f2022-02-13 23:57:37 -08001233 sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
Hong_Liue54db8c2023-04-21 02:37:23 -07001234 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -08001235 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
Hong_Liu55c62f52023-08-24 19:05:50 -07001236 lynq_data_call_id = get_handle(apnType);
rjwc63abb42023-03-31 18:22:42 +08001237 if (lynq_data_call_id < 0)
1238 {
1239 LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001240 return LYNQ_E_NULL_ANONALY+1;
rjwc63abb42023-03-31 18:22:42 +08001241 }
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001242 *handle = lynq_data_call_id;//T8TSK-211 (2023/5/16)
rjw733b9832023-04-03 10:20:08 +08001243 lynq_data_call = 1;
rjwed00d042022-05-25 09:18:16 +08001244 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -08001245 if(send_request(lynq_client_sockfd,&client)==-1)
1246 {
1247 LYERRLOG("send request fail");
1248 perror("[LYNQ_DATA] send request fail:");
Hong_Liu25edfe72023-06-16 01:13:42 -07001249 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001250 return LYNQ_E_NULL_ANONALY+2;
lhf81a46f2022-02-13 23:57:37 -08001251 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001252 //get_response(lynq_client_sockfd,p);
1253 error = wait_response(lynq_client_sockfd,p,client.uToken);
1254 if(error!=0)
1255 {
1256 LYERRLOG("wait_response fail,ret:%d",error);
1257 printf_apn_table_debug(__FUNCTION__,__LINE__);
1258 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1259 return error;
1260 }
rjwed00d042022-05-25 09:18:16 +08001261 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu25edfe72023-06-16 01:13:42 -07001262 JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error);
1263 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1264 free_parcel(p);
lhf81a46f2022-02-13 23:57:37 -08001265 if(error==0)
1266 {
Hong_Liu7e1b85e2023-05-16 05:51:57 -07001267 data_timelimit = 1;
lha62e0882023-10-31 05:17:11 -07001268 if(waitDataCallstateChange(g_data_call_timeout_value)==ETIMEDOUT)
lhf81a46f2022-02-13 23:57:37 -08001269 {
1270 error = LYNQ_E_TIME_OUT;
1271 LYERRLOG("timeout:wait data Call state fail!!!");
1272 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
Hong_Liu6149f182023-05-12 02:15:14 -07001273 if (data_invaild_error == 1)
1274 {
1275 data_invaild_error = 0;
1276 LYERRLOG("urc apn info error!!!");
1277 return 8085;
1278 }
1279 printf_apn_table_debug(__FUNCTION__,__LINE__);
lhf81a46f2022-02-13 23:57:37 -08001280 return error;
1281 }
lha62e0882023-10-31 05:17:11 -07001282 if(lynq_data_call == LYNQ_E_TIME_OUT)
1283 {
1284 error = LYNQ_E_TIME_OUT;
1285 LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
1286 printf_apn_table_debug(__FUNCTION__,__LINE__);
1287 return error;
1288 }
lhf81a46f2022-02-13 23:57:37 -08001289 }
Hong_Liu6149f182023-05-12 02:15:14 -07001290 printf_apn_table_debug(__FUNCTION__,__LINE__);
lhf81a46f2022-02-13 23:57:37 -08001291 return error;
1292}
1293/*
1294int lynq_deactive_data_call_sp(int *handle,char *apnType)
1295{
1296 Parcel p;
1297 lynq_client_t client;
1298 int resp_type = -1;
1299 int request = -1;
1300 int slot_id = -1;
1301 int error = -1;
1302 if(handle==NULL||apnType==NULL)
1303 {
1304 LYERRLOG("handle is null!!!");
1305 return -1;
1306 }
1307 client.uToken = Global_uToken;
1308 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
1309 client.paramLen = 1;
1310 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1311 sprintf(client.param,"%s",apnType);
1312 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1313 if(send_request(lynq_client_sockfd,&client)==-1)
1314 {
1315 LYERRLOG("send request fail");
1316 perror("[LYNQ_DATA] send request fail:");
1317 return -1;
1318 }
1319 get_response(lynq_client_sockfd,p);
rjwfa532972022-09-16 13:39:41 +08001320 JumpHeader(p,&resp_type,&request,&slot_id,&error);
lhf81a46f2022-02-13 23:57:37 -08001321 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1322 return error;
1323}
1324*/
1325int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)
1326{
Hong_Liu25edfe72023-06-16 01:13:42 -07001327 Parcel *p = NULL;
lhf81a46f2022-02-13 23:57:37 -08001328 lynq_client_t client;
1329 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +08001330 int token;
Hong_Liu25edfe72023-06-16 01:13:42 -07001331 int request = -1;
lhf81a46f2022-02-13 23:57:37 -08001332 int slot_id = -1;
1333 int error = -1;
1334 int version =0;
1335 int num = 0;
lhf81a46f2022-02-13 23:57:37 -08001336 char *temp_char = NULL;
1337 if(dataCallList==NULL)
1338 {
1339 LYERRLOG("dataCallList is null!!!");
1340 return -1;
1341 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001342 client.uToken = get_utoken();;
lhf81a46f2022-02-13 23:57:37 -08001343 client.request = 57;//RIL_REQUEST_DATA_CALL_LIST
1344 client.paramLen = 0;
1345 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1346 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwed00d042022-05-25 09:18:16 +08001347 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -08001348 if(send_request(lynq_client_sockfd,&client)==-1)
1349 {
1350 LYERRLOG("send request fail");
1351 perror("[LYNQ_DATA] send request fail:");
Hong_Liu25edfe72023-06-16 01:13:42 -07001352 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -08001353 return -1;
1354 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001355 //get_response(lynq_client_sockfd,p);
1356 error = wait_response(lynq_client_sockfd,p,client.uToken);
1357 if(error!=0)
1358 {
1359 LYERRLOG("wait_response fail,ret:%d",error);
1360 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1361 return error;
1362 }
rjwed00d042022-05-25 09:18:16 +08001363 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu25edfe72023-06-16 01:13:42 -07001364 if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
rjwfa532972022-09-16 13:39:41 +08001365 {
Hong_Liu25edfe72023-06-16 01:13:42 -07001366 LYERRLOG("JumpHeader fail");
rjwfa532972022-09-16 13:39:41 +08001367 return -1;
1368 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001369 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1370 p->readInt32(&version);
lhf81a46f2022-02-13 23:57:37 -08001371 if(version==11)
1372 {
Hong_Liu25edfe72023-06-16 01:13:42 -07001373 p->readInt32(&num);
lhf81a46f2022-02-13 23:57:37 -08001374 *realNum = num;
1375 for (int i = 0; i < num; i++)
1376 {
Hong_Liu25edfe72023-06-16 01:13:42 -07001377 p->readInt32(&dataCallList[i].status);
1378 p->readInt32(&dataCallList[i].suggestedRetryTime);
1379 p->readInt32(&dataCallList[i].cid);
1380 p->readInt32(&dataCallList[i].active);
1381 temp_char = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001382 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1383 if(temp_char)
1384 {
1385 memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);
1386 free(temp_char);
1387 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001388 temp_char = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001389 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1390 if(temp_char)
1391 {
1392 memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);
1393 free(temp_char);
1394 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001395 temp_char = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001396 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1397 if(temp_char)
1398 {
1399 memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);
1400 free(temp_char);
1401 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001402 temp_char = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001403 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1404 if(temp_char)
1405 {
1406 memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);
1407 free(temp_char);
1408 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001409 temp_char = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001410 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1411 if(temp_char)
1412 {
1413 memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);
1414 free(temp_char);
1415 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001416 temp_char = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001417 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1418 if(temp_char)
1419 {
1420 memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);
1421 free(temp_char);
1422 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001423 p->readInt32(&dataCallList[i].mtu);
lhf81a46f2022-02-13 23:57:37 -08001424 }
1425 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001426 free_parcel(p);
lhf81a46f2022-02-13 23:57:37 -08001427 return error;
1428}
Hong_Liu7163bbe2023-06-04 03:03:44 -07001429
1430int lynq_get_apn_msg(int handle,lynq_apn_msg_t *apn_msg)
1431{
1432 LYINFLOG("[lynq_get_apn_msg] enter,handle:%d",handle);
1433 if((handle < 0) || (handle > 6) || (NULL == apn_msg))
1434 {
1435 LYERRLOG("handle value error,or apn_msg is null");
1436 return LYNQ_E_NULL_ANONALY;
1437 }
1438 apn_msg->handle = handle;
1439 if(apn_msg->apn!=NULL)
1440 {
1441 memcpy(apn_msg->apn,lynq_apn_table[handle].apn,LYNQ_APN_MAX_LEN);
1442 }
1443 if(apn_msg->apnType!=NULL)
1444 {
1445 memcpy(apn_msg->apnType,lynq_apn_table[handle].apnType,LYNQ_APN_TYPE_MAX_LEN);
1446 }
1447 return 0;
1448}
1449
lhf81a46f2022-02-13 23:57:37 -08001450int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList)
1451{
1452 lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};
1453 int number = 0;
1454 int lynq_data_call_id = 0;
1455 int error = 0;
lha62e0882023-10-31 05:17:11 -07001456 if (g_lynq_data_init_flag == 0)
1457 {
1458 LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
1459 return -1;
1460 }
lhf81a46f2022-02-13 23:57:37 -08001461 lynq_data_call_id = *handle;
Hong_Liu7163bbe2023-06-04 03:03:44 -07001462 if((handle==NULL) || (dataCallList==NULL))
lhf81a46f2022-02-13 23:57:37 -08001463 {
Hong_Liu7163bbe2023-06-04 03:03:44 -07001464 LYERRLOG("[lynq_get_data_call_list] handle or datacalllist is NULL");
lhf81a46f2022-02-13 23:57:37 -08001465 return LYNQ_E_NULL_ANONALY;
1466 }
Hong_Liu7163bbe2023-06-04 03:03:44 -07001467 if ((*handle < 0) || (*handle > 6))
rjw3938f262023-03-08 16:09:28 +08001468 {
Hong_Liu7163bbe2023-06-04 03:03:44 -07001469 LYERRLOG("[lynq_get_data_call_list] handle value error");
1470 return LYNQ_E_NULL_ANONALY;
rjw3938f262023-03-08 16:09:28 +08001471 }
Hong_Liu7163bbe2023-06-04 03:03:44 -07001472 LYINFLOG("[lynq_get_data_call_list] incoming handle value: %d",*handle);
lhf81a46f2022-02-13 23:57:37 -08001473 memset(interDataCallList,0,sizeof(interDataCallList));
1474 error = getDataCallLists(interDataCallList,&number);
1475 if(error == 0)
1476 {
1477 for(int i = 0;i < number;i++)
1478 {
1479 if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)
1480 {
1481 dataCallList->active = interDataCallList[i].active;
1482 dataCallList->suggestedRetryTime = interDataCallList[i].suggestedRetryTime;
1483 dataCallList->cid = interDataCallList[i].cid;
1484 dataCallList->status = interDataCallList[i].status;
1485 dataCallList->mtu = interDataCallList[i].mtu;
1486 memcpy(dataCallList->addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));
1487 memcpy(dataCallList->ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));
1488 memcpy(dataCallList->dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));
1489 memcpy(dataCallList->type,interDataCallList[i].type,sizeof(interDataCallList[i].type));
1490 memcpy(dataCallList->gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));
1491 memcpy(dataCallList->pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));
1492 LYDBGLOG("ifname:%s,addr:%s",dataCallList->ifname,dataCallList->addresses);
1493 }
1494 }
1495 }
1496 return error;
1497}
1498int lynq_wait_data_call_state_change(int *handle)
1499{
rjwc3d6e582023-03-28 17:19:11 +08001500 if (data_waiting_status == 1)
1501 {
1502 LYDBGLOG("some thread is waiting");
1503 return -3;
1504 }
1505 LYDBGLOG("is empty :%d",s_data_urc_wait_list.empty());
1506 if (s_data_urc_wait_list.empty())
1507 {
1508 LYDBGLOG("start wait");
1509 data_waiting_status = 1;
1510 waitPdnChange();
1511 }
1512 data_waiting_status = 0;
rjw7ee7bb42023-01-18 11:34:28 +08001513 std::vector<int>::iterator iter;
rjw7ee7bb42023-01-18 11:34:28 +08001514
1515 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
1516 iter = s_data_urc_wait_list.begin();
rjwc3d6e582023-03-28 17:19:11 +08001517 if (iter != s_data_urc_wait_list.end())
1518 {
1519 *handle = *iter;
1520 }
rjw7ee7bb42023-01-18 11:34:28 +08001521 s_data_urc_wait_list.erase(iter);
1522 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
1523
Hong_Liudc46d412023-05-18 13:36:26 -07001524 LYINFLOG("lynq_wait_data_call_state_change handle:%d",*handle);
lhf81a46f2022-02-13 23:57:37 -08001525 return 0;
1526}
1527/*Warren add for T800 platform 2021/11/19 end*/
rjw20006d12022-04-21 16:29:04 +08001528
1529/*Typethree add for T800 platform 2022/04/21 start*/
rjw61fcae32022-08-18 14:03:39 +08001530
1531int 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)
rjw20006d12022-04-21 16:29:04 +08001532{
1533 char strtmp[10][32];
rjw61fcae32022-08-18 14:03:39 +08001534 if (id == NULL)
rjw0cdacbc2022-06-22 10:51:07 +08001535 {
rjw61fcae32022-08-18 14:03:39 +08001536 sprintf(strtmp[0], "id=;");
rjw0cdacbc2022-06-22 10:51:07 +08001537 }
rjw61fcae32022-08-18 14:03:39 +08001538 else
rjw0cdacbc2022-06-22 10:51:07 +08001539 {
rjw61fcae32022-08-18 14:03:39 +08001540 sprintf(strtmp[0], "id=%s;", id);
rjw0cdacbc2022-06-22 10:51:07 +08001541 }
rjw20006d12022-04-21 16:29:04 +08001542 if (mcc == NULL)
1543 {
1544 sprintf(strtmp[1], "mcc=;");
1545 }
1546 else
1547 {
1548 sprintf(strtmp[1], "mcc=%s;", mcc);
1549 }
1550 if (mnc == NULL)
1551 {
rjw61fcae32022-08-18 14:03:39 +08001552 sprintf(strtmp[2], "mnc=;");
rjw20006d12022-04-21 16:29:04 +08001553 }
1554 else
1555 {
1556 sprintf(strtmp[2], "mnc=%s;", mnc);
1557 }
1558 if (apn == NULL)
1559 {
1560 sprintf(strtmp[3], "apn=;");
1561 }
1562 else
1563 {
1564 sprintf(strtmp[3], "apn=%s;", apn);
1565 }
1566 if (apntype == NULL)
1567 {
1568 sprintf(strtmp[4], "apntype=;");
1569 }
1570 else
1571 {
1572 sprintf(strtmp[4], "apntype=%s;", apntype);
1573 }
1574 if (user == NULL)
1575 {
1576 sprintf(strtmp[5], "user=;");
1577 }
1578 else
1579 {
1580 sprintf(strtmp[5], "user=%s;", user);
1581 }
1582 if (password == NULL)
1583 {
1584 sprintf(strtmp[6], "password=;");
1585 }
1586 else
1587 {
1588 sprintf(strtmp[6], "password=%s;", password);
1589 }
1590 if (normalprotocol == NULL)
1591 {
1592 sprintf(strtmp[7], "normalprotocol=;");
1593 }
1594 else
1595 {
1596 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1597 }
1598 if (roamingprotocol == NULL)
1599 {
1600 sprintf(strtmp[8], "roamingprotocol=;");
1601 }
1602 else
1603 {
1604 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1605 }
1606 if (carrier == NULL)
1607 {
1608 sprintf(strtmp[9], "carrier=;");
1609 }
1610 else
1611 {
1612 sprintf(strtmp[9], "carrier=%s;", carrier);
1613 }
rjw61fcae32022-08-18 14:03:39 +08001614 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]);
rjw0cdacbc2022-06-22 10:51:07 +08001615
rjw20006d12022-04-21 16:29:04 +08001616 return 0;
1617}
1618
1619int 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)
1620{
1621 char strtmp[10][32];
1622 if (id == NULL)
1623 {
1624 sprintf(strtmp[0], "id=;");
1625 }
1626 else
1627 {
1628 sprintf(strtmp[0], "id=%s;", id);
1629 }
1630 if (mcc == NULL)
1631 {
1632 sprintf(strtmp[1], "mcc=;");
1633 }
1634 else
1635 {
1636 sprintf(strtmp[1], "mcc=%s;", mcc);
1637 }
1638 if (mnc == NULL)
1639 {
1640 sprintf(strtmp[2], "mnc=;");
1641 }
1642 else
1643 {
1644 sprintf(strtmp[2], "mnc=%s;", mnc);
1645 }
1646 if (apn == NULL)
1647 {
1648 sprintf(strtmp[3], "apn=;");
1649 }
1650 else
1651 {
1652 sprintf(strtmp[3], "apn=%s;", apn);
1653 }
1654 if (apntype == NULL)
1655 {
1656 sprintf(strtmp[4], "apntype=;");
1657 }
1658 else
1659 {
1660 sprintf(strtmp[4], "apntype=%s;", apntype);
1661 }
1662 if (user == NULL)
1663 {
1664 sprintf(strtmp[5], "user=;");
1665 }
1666 else
1667 {
1668 sprintf(strtmp[5], "user=%s;", user);
1669 }
1670 if (password == NULL)
1671 {
1672 sprintf(strtmp[6], "password=;");
1673 }
1674 else
1675 {
1676 sprintf(strtmp[6], "password=%s;", password);
1677 }
1678 if (normalprotocol == NULL)
1679 {
1680 sprintf(strtmp[7], "normalprotocol=;");
1681 }
1682 else
1683 {
1684 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1685 }
1686 if (roamingprotocol == NULL)
1687 {
1688 sprintf(strtmp[8], "roamingprotocol=;");
1689 }
1690 else
1691 {
1692 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1693 }
1694 if (carrier == NULL)
1695 {
1696 sprintf(strtmp[9], "carrier=;");
1697 }
1698 else
1699 {
1700 sprintf(strtmp[9], "carrier=%s;", carrier);
1701 }
1702 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]);
1703 return 0;
1704}
1705
rjwaf4b1612022-06-13 17:26:01 +08001706
1707int 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)
1708{
1709 char strtmp[10][32];
1710 if (id == NULL)
1711 {
1712 sprintf(strtmp[0], "");
1713 }
1714 else
1715 {
1716 sprintf(strtmp[0], "id=%s;", id);
1717 }
1718 if (mcc == NULL)
1719 {
1720 sprintf(strtmp[1], "");
1721 }
1722 else
1723 {
1724 sprintf(strtmp[1], "mcc=%s;", mcc);
1725 }
1726 if (mnc == NULL)
1727 {
1728 sprintf(strtmp[2], "");
1729 }
1730 else
1731 {
1732 sprintf(strtmp[2], "mnc=%s;", mnc);
1733 }
1734 if (apn == NULL)
1735 {
1736 sprintf(strtmp[3], "");
1737 }
1738 else
1739 {
1740 sprintf(strtmp[3], "apn=%s;", apn);
1741 }
1742 if (apntype == NULL)
1743 {
1744 sprintf(strtmp[4], "");
1745 }
1746 else
1747 {
1748 sprintf(strtmp[4], "apntype=%s;", apntype);
1749 }
1750 if (user == NULL)
1751 {
1752 sprintf(strtmp[5], "");
1753 }
1754 else
1755 {
1756 sprintf(strtmp[5], "user=%s;", user);
1757 }
1758 if (password == NULL)
1759 {
1760 sprintf(strtmp[6], "");
1761 }
1762 else
1763 {
1764 sprintf(strtmp[6], "password=%s;", password);
1765 }
1766 if (normalprotocol == NULL)
1767 {
1768 sprintf(strtmp[7], "");
1769 }
1770 else
1771 {
1772 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1773 }
1774 if (roamingprotocol == NULL)
1775 {
1776 sprintf(strtmp[8], "");
1777 }
1778 else
1779 {
1780 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1781 }
1782 if (carrier == NULL)
1783 {
1784 sprintf(strtmp[9], "");
1785 }
1786 else
1787 {
1788 sprintf(strtmp[9], "carrier=%s;", carrier);
1789 }
1790 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]);
1791 return 0;
1792}
1793
rjw20006d12022-04-21 16:29:04 +08001794static char *lynqStrdupReadString(Parcel &p)
1795{
1796 size_t stringlen;
1797 const char16_t *s16;
1798
1799 s16 = p.readString16Inplace(&stringlen);
1800 return strndup16to8(s16, stringlen);
1801}
Hong_Liu7163bbe2023-06-04 03:03:44 -07001802int get_imsi()
1803{
Hong_Liu25edfe72023-06-16 01:13:42 -07001804 Parcel *p =NULL;
Hong_Liu7163bbe2023-06-04 03:03:44 -07001805 lynq_client_t client;
1806 int resp_type = -1;
1807 int token;
1808 int request = -1;
1809 int slot_id = -1;
1810 int error = -1;
1811 int version =0;
1812 int num = 0;
1813 char *temp_char = NULL;
1814 char mccmnc[32] = {0};
1815 char mccmnckey[64] = {0};
Hong_Liu25edfe72023-06-16 01:13:42 -07001816 client.uToken = get_utoken();
Hong_Liu7163bbe2023-06-04 03:03:44 -07001817 client.request = 11;//RIL_REQUEST_GET_IMSI 11
1818 client.paramLen = 0;
1819 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1820 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1821 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
1822 if(send_request(lynq_client_sockfd,&client)==-1)
1823 {
1824 LYERRLOG("send request fail");
1825 perror("[LYNQ_DATA] send request fail:");
Hong_Liu25edfe72023-06-16 01:13:42 -07001826 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu7163bbe2023-06-04 03:03:44 -07001827 return -1;
1828 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001829 //get_response(lynq_client_sockfd,p);
1830 error = wait_response(lynq_client_sockfd,p,client.uToken);
1831 if(error!=0)
Hong_Liu7163bbe2023-06-04 03:03:44 -07001832 {
Hong_Liu25edfe72023-06-16 01:13:42 -07001833 LYERRLOG("wait_response fail,ret:%d",error);
1834 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
Hong_Liu7163bbe2023-06-04 03:03:44 -07001835 return error;
1836 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001837 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
1838 if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
Hong_Liu7163bbe2023-06-04 03:03:44 -07001839 {
Hong_Liu25edfe72023-06-16 01:13:42 -07001840 LYERRLOG("JumpHeader fail");
Hong_Liu7163bbe2023-06-04 03:03:44 -07001841 return -1;
1842 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001843 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
1844 if(error == 0)
1845 {
1846 char * test = strdupReadString_p(p);
1847 memcpy(mccmnc, test,5);
1848 mccmnc[5]='\0';
1849 free(test);
1850 sprintf(mccmnckey,"uci set radio_property.property.vendor_ril_data_gsm_mcc_mnc0=%s",mccmnc);
1851 system(mccmnckey);
1852 system("uci commit");
1853 }
1854 free_parcel(p);
1855 return error;
Hong_Liu7163bbe2023-06-04 03:03:44 -07001856}
rjw20006d12022-04-21 16:29:04 +08001857int 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)
1858{
1859 if (NULL == id && NULL == mcc && NULL == mnc && NULL == apn && NULL == apntype && NULL == user && NULL == password && NULL == normalprotocol && NULL == roamingprotocol && NULL == carrier)
1860 {
1861 LYERRLOG("There are no valid parameters");
1862 return -1;
1863 }
1864 lynq_client_t client;
1865 char argc[512];
Hong_Liu7163bbe2023-06-04 03:03:44 -07001866 int res = -1;
rjw20006d12022-04-21 16:29:04 +08001867 if (cmd == 0) // insert apn db
1868 {
rjw61fcae32022-08-18 14:03:39 +08001869 res = insert_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
Hong_Liu25edfe72023-06-16 01:13:42 -07001870 client.uToken = get_utoken();
rjw20006d12022-04-21 16:29:04 +08001871 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1872 client.paramLen = 2;
1873 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1874 sprintf(client.param, "%d %s", cmd, argc);
1875 }
rjw61fcae32022-08-18 14:03:39 +08001876 else if (cmd == 1) //delete apn db
rjw20006d12022-04-21 16:29:04 +08001877 {
1878 if (NULL == id)
1879 {
1880 LYERRLOG("id is NULL!!!please input id: ");
1881 }
1882 sprintf(argc, "id=%s", id);
Hong_Liu25edfe72023-06-16 01:13:42 -07001883 client.uToken = get_utoken();
rjw20006d12022-04-21 16:29:04 +08001884 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1885 client.paramLen = 2;
1886 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1887 sprintf(client.param, "%d %s", cmd, argc);
1888 }
rjw61fcae32022-08-18 14:03:39 +08001889 else if (cmd == 2) //query apn db
rjw20006d12022-04-21 16:29:04 +08001890 {
rjwaf4b1612022-06-13 17:26:01 +08001891 query_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
Hong_Liu25edfe72023-06-16 01:13:42 -07001892 client.uToken = get_utoken();
rjw20006d12022-04-21 16:29:04 +08001893 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1894 client.paramLen = 2;
1895 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1896 sprintf(client.param, "%d %s", cmd, argc);
1897 }
rjw61fcae32022-08-18 14:03:39 +08001898 else if (cmd == 3) //modify apn db
rjw20006d12022-04-21 16:29:04 +08001899 {
1900 modify_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
Hong_Liu25edfe72023-06-16 01:13:42 -07001901 client.uToken = get_utoken();
rjw20006d12022-04-21 16:29:04 +08001902 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1903 client.paramLen = 2;
1904 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1905 sprintf(client.param, "%d %s", cmd, argc);
1906 }
1907 else
1908 {
1909 LYERRLOG("incoming command is invalid");
1910 return -1;
1911 }
1912 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwed00d042022-05-25 09:18:16 +08001913 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001914 if(send_request(lynq_client_sockfd,&client)==-1)
1915 {
1916 LYERRLOG("send request fail");
Hong_Liu25edfe72023-06-16 01:13:42 -07001917 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001918 return -1;
1919 }
rjwed00d042022-05-25 09:18:16 +08001920 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001921 waitApnResult();
rjw3bcbbf12022-04-22 16:47:18 +08001922 strcpy(out, g_lynq_apn_result);
rjw20006d12022-04-21 16:29:04 +08001923 LYINFLOG(">>>>>output info:%s",out);
1924 return 0;
1925}
1926
1927int lynq_reset_apn(char *result)
1928{
rjw20006d12022-04-21 16:29:04 +08001929 lynq_client_t client;
rjw3bcbbf12022-04-22 16:47:18 +08001930 if (NULL == result)
1931 {
1932 LYERRLOG("incoming paramters error");
1933 }
Hong_Liu25edfe72023-06-16 01:13:42 -07001934 client.uToken = get_utoken();
rjw20006d12022-04-21 16:29:04 +08001935 client.request = 2000 + 194;
1936 client.paramLen = 0;
1937 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1938 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s", client.uToken, client.request, client.paramLen, client.param);
rjwed00d042022-05-25 09:18:16 +08001939 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001940 if (send_request(lynq_client_sockfd, &client) == -1)
1941 {
1942 LYERRLOG("send request fail");
Hong_Liu25edfe72023-06-16 01:13:42 -07001943 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001944 return -1;
1945 }
rjwed00d042022-05-25 09:18:16 +08001946 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001947 waitApnResult();
1948 strcpy(result, g_lynq_apn_result);
1949 LYINFLOG(">>>>>result:%s",result);
1950 return 0;
1951}
1952
rjw3bcbbf12022-04-22 16:47:18 +08001953/*Typethree add for T800 platform 2022/04/21 end*/
Hong_Liu7d9ac8d2023-07-24 00:40:31 -07001954static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
1955 FILE *fp;
1956 //printf("to exec cmd:%s\n", str_cmd);
1957 if((fp=popen(str_cmd,"r"))==NULL)
1958 {
1959 perror("popen error!");
1960 return -1;
1961 }
1962 if((fread(str_cmd_ret,max_len,1,fp))<0)
1963 {
1964 perror("fread fail!");
1965 fclose(fp);
1966 return -1;
1967 }
1968 fclose(fp);
1969 return 0;
1970}
1971int check_apn_status()
1972{
1973 LYINFLOG("check_apn_status enter");
1974 int ret = -1;
1975 char cmd_ret[8] ={0};//get mccmnc
1976 const char *cmd = "uci get radio_property.property.vendor_ril_data_gsm_mcc_mnc0";
1977 const char *empty_str = ":empty";
1978 ret = exec_cmd(cmd,cmd_ret,8);
1979 if(ret==0)
1980 {
1981 if(strlen(cmd_ret)==0)
1982 {
1983 LYERRLOG("not have mccmnc config in uci ram");
1984 return 1;
1985 }
1986 if(strncmp(cmd_ret,empty_str,strlen(empty_str))==0)
1987 {
1988 LYERRLOG("mccmnc is empty");
1989 return 2;
1990 }
1991 LYINFLOG("mccmnc is %s",cmd_ret);
1992 return 0;
1993 }
1994 else
1995 {
1996 LYERRLOG("exec cmd fail");
1997 return -1;
1998 }
1999 return 0;
2000}
lha62e0882023-10-31 05:17:11 -07002001int get_timeout_value()
2002{
2003 LYINFLOG("get_timeout_value enter");
2004 int ret = -1;
2005 char timeout_value[8] ={0};//get get_timeout_value
2006 ret = lynq_get_value("lynq_uci","data_call","timeout",timeout_value);
2007 if(ret == 0)
2008 {
2009 LYINFLOG("data_call.timeout is %s",timeout_value);
2010 return atoi(timeout_value);
2011 }
2012 else
2013 {
2014 LYERRLOG("get_timeout_value");
2015 return -1;
2016 }
2017}
2018
Hong_Liu7d9ac8d2023-07-24 00:40:31 -07002019int radio_switch(int status)
2020{
2021 Parcel *p =NULL;
2022 lynq_client_t client;
2023 int resp_type = -1;
2024 int token;
2025 int request = -1;
2026 int slot_id = -1;
2027 int error = -1;
2028 int version =0;
2029 int num = 0;
2030 char *temp_char = NULL;
2031 char mccmnc[32] = {0};
2032 char mccmnckey[64] = {0};
2033 client.uToken = get_utoken();
2034 client.request = 59;//RIL_REQUEST_OEM_HOOK_RAW 59
2035 client.paramLen = 1;
2036 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
2037 sprintf(client.param,"AT+CFUN=%d",status);
2038 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
2039 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
2040 if(send_request(lynq_client_sockfd,&client)==-1)
2041 {
2042 LYERRLOG("send request fail");
2043 perror("[LYNQ_DATA] send request fail:");
2044 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
2045 return -1;
2046 }
2047 //get_response(lynq_client_sockfd,p);
2048 error = wait_response(lynq_client_sockfd,p,client.uToken);
2049 if(error!=0)
2050 {
2051 LYERRLOG("wait_response fail,ret:%d",error);
2052 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
2053 return error;
2054 }
2055 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
2056 if(JumpHeader(p,&resp_type,&client.uToken,&request,&slot_id,&error)!=0)
2057 {
2058 LYERRLOG("JumpHeader fail");
2059 return -1;
2060 }
2061 LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,client.uToken,request,slot_id,error);
2062 free_parcel(p);
2063 return error;
2064}