blob: 3d38cdfb84c49e03464414e0a11c8cc62209cd82 [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
lhf81a46f2022-02-13 23:57:37 -080022#define LYNQ_REC_BUF 8192
23#define LYNQ_REQUEST_PARAM_BUF 8192
24#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
25#define USER_LOG_TAG "LYNQ_DATA"
26
rjw0cdacbc2022-06-22 10:51:07 +080027#define LYNQ_DATA_UCI_BUF 258
rjw61fcae32022-08-18 14:03:39 +080028
jb.qid5852372023-03-29 10:29:12 +080029#define LYNQ_ADDRESS "127.0.0.1"
30
lhf81a46f2022-02-13 23:57:37 -080031using ::android::Parcel;
32typedef struct{
33 int uToken;
34 int request;
35 int paramLen;
36 char param[LYNQ_REQUEST_PARAM_BUF];
37}lynq_client_t;
lh13586612022-01-11 21:58:58 -080038typedef enum{
39 LYNQ_E_CARDSTATE_ERROR=8000,
40 /* The voice service state is out of service*/
41 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
42 /* The voice service state is EMERGENCY_ONLY*/
43 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
44 /* The radio power is power off*/
45 LYNQ_E_STATE_POWER_OFF=8003,
46 LYNQ_E_TIME_OUT=8004,
47 /*create or open sms DB fail */
48 LYNQ_E_SMS_DB_FAIL=8005,
49 /*Failed to execute sql statement*/
50 LYNQ_E_SMS_SQL_FAIL = 8006,
51 LYNQ_E_SMS_NOT_FIND = 8007,
52 /* The logic conflict*/
53 LYNQ_E_CONFLICT=9000,
54 /*Null anomaly*/
55 LYNQ_E_NULL_ANONALY=9001
lhf81a46f2022-02-13 23:57:37 -080056}LYNQ_E;
57
58int lynq_client_sockfd = 0;
59int Global_uToken = 0;
rjw7ee7bb42023-01-18 11:34:28 +080060
lhf81a46f2022-02-13 23:57:37 -080061int lynq_data_call_change_id = -1;
62pthread_t lynq_data_tid =-1;
63static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
64static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
rjw7ee7bb42023-01-18 11:34:28 +080065
rjw20006d12022-04-21 16:29:04 +080066static pthread_mutex_t s_lynq_apn_change_mutex = PTHREAD_MUTEX_INITIALIZER;
67static pthread_cond_t s_lynq_apn_change_cond = PTHREAD_COND_INITIALIZER;
rjw7ee7bb42023-01-18 11:34:28 +080068static pthread_mutex_t s_lynq_urc_vector_mutex = PTHREAD_MUTEX_INITIALIZER;
69static pthread_cond_t s_lynq_urc_vector_cond = PTHREAD_COND_INITIALIZER;
rjwed00d042022-05-25 09:18:16 +080070/**g_lynq_data_sendto_mutex
71* @brief mark data send request mutex
72*/
73static pthread_mutex_t g_lynq_data_sendto_mutex;
rjwf9ec3832023-04-12 10:59:15 +080074/*This value data the state of the wait*/
rjwc3d6e582023-03-28 17:19:11 +080075static int data_waiting_status = 0;
rjwf9ec3832023-04-12 10:59:15 +080076/*The value indicates that 8085 error occurs in data*/
rjwc63abb42023-03-31 18:22:42 +080077static int data_invaild_error = 0;
rjwf9ec3832023-04-12 10:59:15 +080078/*This value ensure the data call timing is correct*/
79static int data_timelimit = 0;
rjwc63abb42023-03-31 18:22:42 +080080
rjw22947c22022-03-15 09:21:29 +080081/**g_lynq_data_init_flag
82* @brief mark data initialization state
83* 0:deinit status
84* 1:init state
85*/
86static int g_lynq_data_init_flag = 0;
rjw20006d12022-04-21 16:29:04 +080087/**g_lynq_apn_result
88* @brief temp of apn result info
89*/
90char g_lynq_apn_result[1024] = {};
rjw747deea2022-07-01 18:25:30 +080091
rjw7ee7bb42023-01-18 11:34:28 +080092static std::vector<int> s_data_urc_wait_list;
93
rjw20006d12022-04-21 16:29:04 +080094typedef struct
95{
lhf81a46f2022-02-13 23:57:37 -080096 char apn[LYNQ_APN_MAX_LEN];
97 char apnType[LYNQ_APN_TYPE_MAX_LEN];
98 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
99 int hasUsed;
100 int hasTimeout;
101}lynq_apn_t;
102lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {};
103lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};
104int lynq_data_call = 0;
lhf81a46f2022-02-13 23:57:37 -0800105
lhf81a46f2022-02-13 23:57:37 -0800106int getLynqApnID(char apnType[])
107{
108 int ret = 0;
rjwc63abb42023-03-31 18:22:42 +0800109 int len = 0;
lhf81a46f2022-02-13 23:57:37 -0800110 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
111 {
rjwc63abb42023-03-31 18:22:42 +0800112 len = strlen(lynq_apn_table[ret].apnType)<strlen(apnType) ? strlen(lynq_apn_table[ret].apnType):strlen(apnType);
Hong_Liu6149f182023-05-12 02:15:14 -0700113 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 +0800114 if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0)
lh13586612022-01-11 21:58:58 -0800115 {
lhf81a46f2022-02-13 23:57:37 -0800116 return ret;
117 }
118 }
119 return -1;
120}
rjw7ee7bb42023-01-18 11:34:28 +0800121
lhf81a46f2022-02-13 23:57:37 -0800122void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[])
123{
124 LYDBGLOG("[updateApnTable] apn:%s,apntype:%s,ifaceName:%s",apn,apntype,ifaceName);
125 if(apn_table==NULL)
126 {
127 LYERRLOG("apn_table is null");
128 return;
129 }
130 memcpy(apn_table->apn,apn,strlen(apn)+1);
131 memcpy(apn_table->apnType,apntype,strlen(apntype)+1);
132 memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1);
133 apn_table->hasTimeout = 0;
134 apn_table->hasUsed = 1;
135 return;
136}
rjw7ee7bb42023-01-18 11:34:28 +0800137
lhf81a46f2022-02-13 23:57:37 -0800138void cleanOnceApnTable(int apnId)
139{
140 LYDBGLOG("apn id:%d",apnId);
141 if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1))
142 {
143 LYERRLOG("apn id is invalid!!!");
144 return;
145 }
146 lynq_apn_table[apnId].hasTimeout = 0;
147 lynq_apn_table[apnId].hasUsed = 0;
148 bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);
149 //bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
150 bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
151 return;
152}
153int getUnusedElement()
154{
rjwc63abb42023-03-31 18:22:42 +0800155 if (lynq_apn_table == NULL)
156 {
157 LYERRLOG("get UnusedElemnt apn_table is null");
158 return -1;
159 }
lhf81a46f2022-02-13 23:57:37 -0800160 for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++)
161 {
162 if(lynq_apn_table[i].hasUsed!=1)
163 {
164 return i;
165 }
166 }
rjwc63abb42023-03-31 18:22:42 +0800167 LYERRLOG("None of get unused Element");
lhf81a46f2022-02-13 23:57:37 -0800168 return -1;
169}
170int updateApn(char apnType[])
171{
172 int ret = 0;
173 ret = getUnusedElement();
174 memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1);
175 lynq_apn_table[ret].hasUsed = 1;
176 return ret;
177}
rjw1309e232022-07-22 09:54:06 +0800178
179int handleCheck(int handle)
180{
181 if (lynq_apn_table[handle].hasUsed == 1)
182 {
183 return 0;
184 }
185 else
186 {
187 return -1;
188 }
189}
rjw20006d12022-04-21 16:29:04 +0800190int waitApnResult()
191{
192 int ret = 0;
193 LYINFLOG("start wait apn result!!!");
194 int sec = 0;
195 int usec = 0;
196 struct timeval now;
197 struct timespec timeout;
198 gettimeofday(&now, NULL);
199 sec = 20000 / 1000;
200 usec = 20000 % 1000;
201 timeout.tv_sec = now.tv_sec + sec;
202 timeout.tv_nsec = now.tv_usec * 1000 + usec * 1000000;
203 pthread_mutex_lock(&s_lynq_apn_change_mutex);
204 ret = pthread_cond_timedwait(&s_lynq_apn_change_cond, &s_lynq_apn_change_mutex, &timeout);
205 pthread_mutex_unlock(&s_lynq_apn_change_mutex);
206 return ret;
207}
208
209void sendSignalApnChange()
210{
211 LYINFLOG("start send Signal Apn Change");
212 pthread_mutex_lock(&s_lynq_apn_change_mutex);
213 pthread_cond_signal(&s_lynq_apn_change_cond);
214 pthread_mutex_unlock(&s_lynq_apn_change_mutex);
215 return;
216}
lhf81a46f2022-02-13 23:57:37 -0800217
218int waitPdnChange()
219{
220 int ret = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800221 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
222 ret = pthread_cond_wait(&s_lynq_urc_vector_cond,&s_lynq_urc_vector_mutex);
223 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
lhf81a46f2022-02-13 23:57:37 -0800224 return ret;
225}
226int waitDataCallstateChange(int mtime)
227{
228 int ret = 0;
229 int sec = 0;
230 int usec = 0;
231 struct timeval now;
232 struct timespec timeout;
233 gettimeofday(&now,NULL);
234 sec = mtime/1000;
235 usec = mtime%1000;
236 timeout.tv_sec = now.tv_sec+sec;
237 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
238 pthread_mutex_lock(&s_data_call_state_change_mutex);
239 ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout);
240 pthread_mutex_unlock(&s_data_call_state_change_mutex);
241 return ret;
242}
243void sendSignalDataCallStateChange()
244{
245 pthread_mutex_lock(&s_data_call_state_change_mutex);
246 pthread_cond_signal(&s_data_call_state_change_cond);
247 pthread_mutex_unlock(&s_data_call_state_change_mutex);
248 return;
249}
250void sendSignalPdnChange()
251{
rjw7ee7bb42023-01-18 11:34:28 +0800252 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
253 pthread_cond_signal(&s_lynq_urc_vector_cond);
254 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
lhf81a46f2022-02-13 23:57:37 -0800255 return;
256}
257
258int get_response(int sockfd,Parcel &p)
259{
260 int len = 0;
261 char recvline[LYNQ_REC_BUF];
262 bzero(recvline,LYNQ_REC_BUF);
263 /* receive data from server */
rjw08528682022-07-04 21:28:02 +0800264 len = read(sockfd, recvline, LYNQ_REC_BUF);
265 if(len == -1)
lhf81a46f2022-02-13 23:57:37 -0800266 {
rjw747deea2022-07-01 18:25:30 +0800267 LYERRLOG("read error");
lhf81a46f2022-02-13 23:57:37 -0800268 return -1;
269 }
270 if (recvline != NULL) {
271 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
272 p.setDataPosition(0);
273 }
274 return 0;
275}
rjwfa532972022-09-16 13:39:41 +0800276int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
lhf81a46f2022-02-13 23:57:37 -0800277{
278 if(p.dataAvail() > 0)
279 {
280 p.readInt32(resp_type);
281 p.readInt32(request);
282 p.readInt32(slot_id);
283 p.readInt32(error);
284 return 0;
285 }
286 else
287 {
288 return -1;
289 }
290}
291int send_request(int sockfd,lynq_client_t *client_tmp)
292{
293 int ret=0;
294 ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);
295 if(ret==-1)
296 {
297 perror("write error");
298 return -1;
299 }
300 return 0;
301}
302static char *strdupReadString(Parcel &p) {
303 size_t stringlen;
304 const char16_t *s16;
305 s16 = p.readString16Inplace(&stringlen);
306 return strndup16to8(s16, stringlen);
307}
308static char *strdupReadString_p(Parcel *p) {
309 size_t stringlen;
310 const char16_t *s16;
311 s16 = p->readString16Inplace(&stringlen);
312 return strndup16to8(s16, stringlen);
313}
314
lhf81a46f2022-02-13 23:57:37 -0800315/*Warren add for T800 platform 2021/11/19 start*/
316int lynq_socket_client_start()
317{
rjw08528682022-07-04 21:28:02 +0800318 struct sockaddr_in lynq_data_socket_server_addr;
lhf81a46f2022-02-13 23:57:37 -0800319 /* init lynq_socket_server_addr */
rjw747deea2022-07-01 18:25:30 +0800320 bzero(&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr));
321 lynq_data_socket_server_addr.sin_family = AF_INET;
322 lynq_data_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
jb.qid5852372023-03-29 10:29:12 +0800323 lynq_data_socket_server_addr.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);
lhf81a46f2022-02-13 23:57:37 -0800324 /*
325 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
326 {
327 printf("[%s] is not a valid IPaddress\n", argv[1]);
328 exit(1);
329 }
330*/
331 lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
rjw747deea2022-07-01 18:25:30 +0800332 struct timeval timeOut;
333
rjwa59bf312022-07-05 11:50:31 +0800334 timeOut.tv_sec = 30;
rjw747deea2022-07-01 18:25:30 +0800335 timeOut.tv_usec = 0;
336
337 if (setsockopt(lynq_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
338 {
339 LYERRLOG("time out setting failed");
340 }
341 if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr)) == -1)
lhf81a46f2022-02-13 23:57:37 -0800342 {
343 perror("connect error");
344 return -1;
345 }
346 return 0;
347}
rjw7ee7bb42023-01-18 11:34:28 +0800348
349bool is_support_urc(int urc_id)
lhf81a46f2022-02-13 23:57:37 -0800350{
rjw7ee7bb42023-01-18 11:34:28 +0800351 switch(urc_id)
352 {
353 case LYNQ_URC_DATA_CALL_STATUS_IND:
354
355 case LYNQ_URC_MODIFY_APNDB:
356 case LYNQ_URC_RESET_APNDB:
357 return true;
358 default:
359 return false;
360 }
361}
362
rjwc63abb42023-03-31 18:22:42 +0800363int printf_apn_table()
364{
365 int ret = 0;
Hong_Liu6149f182023-05-12 02:15:14 -0700366 if (lynq_apn_table == NULL)
367 {
368 LYERRLOG("apn table is null");
369 return -1;
370 }
rjwc63abb42023-03-31 18:22:42 +0800371 for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
372 {
Hong_Liu6149f182023-05-12 02:15:14 -0700373 LYINFLOG("[%s][%d] apn=%s ;apntype=%s ;ifname=%s ;hasTimeout = %d ; hasUsed = %d",__FUNCTION__,ret, \
rjwc63abb42023-03-31 18:22:42 +0800374 lynq_apn_table[ret].apn,lynq_apn_table[ret].apnType,lynq_apn_table[ret].ifaceName, \
375 lynq_apn_table[ret].hasTimeout,lynq_apn_table[ret].hasUsed);
376 }
377 return 0;
378}
379
Hong_Liu6149f182023-05-12 02:15:14 -0700380void printf_apn_table_debug(const char *fun,int line)
381{
382 LYINFLOG("[%s][%d]apn_table msg",fun,line);
383 printf_apn_table();
384}
rjwc63abb42023-03-31 18:22:42 +0800385
rjw7ee7bb42023-01-18 11:34:28 +0800386void urc_msg_process(Parcel *p)
387{
388 int len;
389 int resp_type;
390 int urcid;
391 int slot_id;
rjwf9ec3832023-04-12 10:59:15 +0800392 int check_count = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800393
394 int pdnState = 0;
lhf81a46f2022-02-13 23:57:37 -0800395 char apn[LYNQ_APN_MAX_LEN];
396 char apnType[LYNQ_APN_TYPE_MAX_LEN];
lhf81a46f2022-02-13 23:57:37 -0800397 char ifaceName[LYNQ_IFACE_NAME_MAX_LEN];
lhf81a46f2022-02-13 23:57:37 -0800398 char *urc_msg = NULL;
rjw7ee7bb42023-01-18 11:34:28 +0800399
400 int size = p->dataSize();
401 p->readInt32(&resp_type);
402 p->readInt32(&urcid);
403 p->readInt32(&slot_id);
404 LYINFLOG("data lib recv urc:resp_type=%d,urcid=%d,slot_id=%d,size=%d\n",resp_type,urcid,slot_id,size);
405 switch(urcid)
lhf81a46f2022-02-13 23:57:37 -0800406 {
rjw7ee7bb42023-01-18 11:34:28 +0800407 case LYNQ_URC_DATA_CALL_STATUS_IND:
408 p->readInt32(&pdnState);
409 bzero(apn,LYNQ_APN_MAX_LEN);
410 bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
411 bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
412 if(pdnState!=4)//PDN_DISCONNECTED
lhf81a46f2022-02-13 23:57:37 -0800413 {
rjw20006d12022-04-21 16:29:04 +0800414 urc_msg = strdupReadString_p(p);
rjw7ee7bb42023-01-18 11:34:28 +0800415 int len = strlen(urc_msg);
Hong_Liu6149f182023-05-12 02:15:14 -0700416 if((len < LYNQ_APN_MAX_LEN-1) && (len > 0))
rjw20006d12022-04-21 16:29:04 +0800417 {
rjw7ee7bb42023-01-18 11:34:28 +0800418 memcpy(apn,urc_msg,len+1);
rjw20006d12022-04-21 16:29:04 +0800419 }
Hong_Liu6149f182023-05-12 02:15:14 -0700420 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800421 urc_msg = strdupReadString_p(p);
422 len = strlen(urc_msg);
Hong_Liu6149f182023-05-12 02:15:14 -0700423 if((len < LYNQ_APN_TYPE_MAX_LEN-1) && (len > 0))
rjw7ee7bb42023-01-18 11:34:28 +0800424 {
425 memcpy(apnType,urc_msg,len+1);
426 }
Hong_Liu6149f182023-05-12 02:15:14 -0700427 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800428 urc_msg = strdupReadString_p(p);
429 len = strlen(urc_msg);
Hong_Liu6149f182023-05-12 02:15:14 -0700430 if((len < LYNQ_IFACE_NAME_MAX_LEN-1) && (len > 0))
rjw7ee7bb42023-01-18 11:34:28 +0800431 {
432 memcpy(ifaceName,urc_msg,strlen(urc_msg)+1);
433 }
Hong_Liu6149f182023-05-12 02:15:14 -0700434 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800435 //sendSignalDataCallStateChange();
436 int apnId = getLynqApnID(apnType);
Hong_Liu6149f182023-05-12 02:15:14 -0700437 LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId);
rjw7ee7bb42023-01-18 11:34:28 +0800438 if(apnId >= 0)
439 {
440 if(lynq_apn_table[apnId].hasTimeout==1)
441 {
rjwc63abb42023-03-31 18:22:42 +0800442 /*whether timeout?,real or not,*/
443 printf_apn_table();
rjw7ee7bb42023-01-18 11:34:28 +0800444 LYERRLOG("apn:%s has time out,deacive this apn",lynq_apn_table[apnId].apn);
rjw3938f262023-03-08 16:09:28 +0800445 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 +0800446 {
447 LYERRLOG("deactive this time out APN");
448 lynq_deactive_data_call(&apnId);
449 }
rjwc63abb42023-03-31 18:22:42 +0800450 else
rjw7ee7bb42023-01-18 11:34:28 +0800451 {
rjwc63abb42023-03-31 18:22:42 +0800452 /*if apn lose,update apn and deactive all apn*/
453 LYERRLOG("this table is invalid update APN table");
rjw7ee7bb42023-01-18 11:34:28 +0800454 }
455 break;
456 }
rjwacdb2152023-02-07 14:12:49 +0800457 updateApnTable(&lynq_apn_table[apnId],apn,apnType,ifaceName);
Hong_Liu6149f182023-05-12 02:15:14 -0700458 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw7ee7bb42023-01-18 11:34:28 +0800459 }
460 /*To be completed*/
rjw20006d12022-04-21 16:29:04 +0800461 else
462 {
Hong_Liu6149f182023-05-12 02:15:14 -0700463 data_invaild_error = 1;
rjwc63abb42023-03-31 18:22:42 +0800464 printf_apn_table();
465 LYERRLOG("invalid apnId:%d",apnId);
rjw7ee7bb42023-01-18 11:34:28 +0800466 break;
rjw20006d12022-04-21 16:29:04 +0800467 }
rjw7ee7bb42023-01-18 11:34:28 +0800468 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
469 s_data_urc_wait_list.push_back(apnId);
470 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
471 lynq_data_call_change_id = apnId;
rjwc3d6e582023-03-28 17:19:11 +0800472 sendSignalPdnChange();
rjw7ee7bb42023-01-18 11:34:28 +0800473 LYDBGLOG("data call state:%d",lynq_data_call);
474 if(lynq_data_call==1)
475 {
rjwf9ec3832023-04-12 10:59:15 +0800476 while (data_timelimit == 0)
477 {
478 LYINFLOG("client not ready to wait");
479 for (check_count = 0;check_count < 500;check_count++)
480 {
481 /*wait 10ms*/
482 usleep(10*1000);
483 }
484 LYERRLOG("client still without res");
485 break;
486 }
rjw7ee7bb42023-01-18 11:34:28 +0800487 sendSignalDataCallStateChange();
488 lynq_data_call = 0;
rjwf9ec3832023-04-12 10:59:15 +0800489 data_timelimit = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800490 }
Hong_Liu6149f182023-05-12 02:15:14 -0700491 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw20006d12022-04-21 16:29:04 +0800492 }
rjw7ee7bb42023-01-18 11:34:28 +0800493 else
rjw20006d12022-04-21 16:29:04 +0800494 {
rjw7ee7bb42023-01-18 11:34:28 +0800495 urc_msg = strdupReadString_p(p);
Hong_Liu6149f182023-05-12 02:15:14 -0700496 free(urc_msg);
497 urc_msg = strdupReadString_p(p);
rjw7ee7bb42023-01-18 11:34:28 +0800498 len = strlen(urc_msg);
499 if(len < LYNQ_APN_TYPE_MAX_LEN-1)
500 {
501 memcpy(apnType,urc_msg,len+1);
502 }
Hong_Liu6149f182023-05-12 02:15:14 -0700503 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800504 LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType);
505 int apnId = getLynqApnID(apnType);
Hong_Liu6149f182023-05-12 02:15:14 -0700506 LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId);
rjw7ee7bb42023-01-18 11:34:28 +0800507 if(apnId >= 0)
508 {
509 lynq_data_call_change_id = apnId;
510 bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean
rjw3938f262023-03-08 16:09:28 +0800511 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
512 s_data_urc_wait_list.push_back(apnId);
513 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
rjwc3d6e582023-03-28 17:19:11 +0800514 sendSignalPdnChange();
rjw7ee7bb42023-01-18 11:34:28 +0800515 }
rjw7ee7bb42023-01-18 11:34:28 +0800516 LYDBGLOG("data call state:%d",lynq_data_call);
517 if(lynq_data_call==1)
518 {
rjwf9ec3832023-04-12 10:59:15 +0800519 while (data_timelimit == 0)
520 {
521 LYINFLOG("client not ready to wait");
522 for (check_count = 0;check_count < 500;check_count++)
523 {
524 /*wait 10ms*/
525 usleep(10*1000);
526 }
527 LYERRLOG("client still without res");
528 break;
529 }
rjw7ee7bb42023-01-18 11:34:28 +0800530 sendSignalDataCallStateChange();
531 lynq_data_call = 0;
rjwf9ec3832023-04-12 10:59:15 +0800532 data_timelimit = 0;
rjw7ee7bb42023-01-18 11:34:28 +0800533 }
Hong_Liu6149f182023-05-12 02:15:14 -0700534 printf_apn_table_debug(__FUNCTION__,__LINE__);
rjw7ee7bb42023-01-18 11:34:28 +0800535 }
536 break;
537 case LYNQ_URC_MODIFY_APNDB:
538 urc_msg = strdupReadString_p(p);
539 if (NULL == urc_msg)
540 {
541 LYERRLOG("error apn msg");
542 }
543 else
544 {
545 bzero(g_lynq_apn_result, 1024);
546 strcpy(g_lynq_apn_result, urc_msg);
547 sendSignalApnChange();
548 }
Hong_Liu6149f182023-05-12 02:15:14 -0700549 free(urc_msg);
rjw7ee7bb42023-01-18 11:34:28 +0800550 break;
551 case LYNQ_URC_RESET_APNDB:
552 {
rjw20006d12022-04-21 16:29:04 +0800553 urc_msg = strdupReadString_p(p);
554 if (NULL == urc_msg)
555 {
556 LYERRLOG("error apn msg");
557 }
558 else
559 {
560 bzero(g_lynq_apn_result, 1024);
561 strcpy(g_lynq_apn_result, urc_msg);
562 sendSignalApnChange();
563 }
Hong_Liu6149f182023-05-12 02:15:14 -0700564 free(urc_msg);
rjw20006d12022-04-21 16:29:04 +0800565 }
rjw7ee7bb42023-01-18 11:34:28 +0800566 default:
567 break;
lhf81a46f2022-02-13 23:57:37 -0800568 }
rjw7ee7bb42023-01-18 11:34:28 +0800569
lhf81a46f2022-02-13 23:57:37 -0800570}
rjw7ee7bb42023-01-18 11:34:28 +0800571
rjw7ee7bb42023-01-18 11:34:28 +0800572int create_urc_vector_signal_thread()
573{
574 int ret;
rjw7ee7bb42023-01-18 11:34:28 +0800575 pthread_mutex_init(&s_lynq_urc_vector_mutex,NULL);
rjw7ee7bb42023-01-18 11:34:28 +0800576 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
577 s_data_urc_wait_list.clear();
578 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
lhf81a46f2022-02-13 23:57:37 -0800579 return 0;
580}
rjw7ee7bb42023-01-18 11:34:28 +0800581
lhf81a46f2022-02-13 23:57:37 -0800582int lynq_init_data(int uToken)
583{
rjw22947c22022-03-15 09:21:29 +0800584 if (g_lynq_data_init_flag == 1)
585 {
586 LYERRLOG("init twice is not allowed");
587 return -1;
588 }
589 g_lynq_data_init_flag = 1;
lhf81a46f2022-02-13 23:57:37 -0800590 int result = 0;
591 Global_uToken = uToken;
lhf81a46f2022-02-13 23:57:37 -0800592 LYLOGSET(LOG_INFO);
593 LYLOGEINIT(USER_LOG_TAG);
594 result = lynq_socket_client_start();
rjwed00d042022-05-25 09:18:16 +0800595 pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
lhf81a46f2022-02-13 23:57:37 -0800596 if(result!=0)
597 {
598 LYERRLOG("init socket client fail!!!");
599 return -1;
600 }
rjw7ee7bb42023-01-18 11:34:28 +0800601 result = lynq_init_data_urc_thread();
602 if(result!=0)
603 {
604 LYERRLOG("init socket urc fail!!!");
605 return -1;
606 }
607
608 result = create_urc_vector_signal_thread();
lhf81a46f2022-02-13 23:57:37 -0800609 if(result!=0)
610 {
611 LYERRLOG("init socket urc fail!!!");
612 return -1;
613 }
614 memset(lynq_apn_table,0,sizeof(lynq_apn_table));
615 LYDBGLOG("lynq init call success!!!");
616 return 0;
617
618}
619int lynq_deinit_data()
620{
621 int ret = -1;
rjw22947c22022-03-15 09:21:29 +0800622 if (g_lynq_data_init_flag == 0)
623 {
624 LYERRLOG("deinit twice is not allowed");
625 return ret;
626 }
627 g_lynq_data_init_flag = 0;
lhf81a46f2022-02-13 23:57:37 -0800628 for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++)
629 {
630 if(strlen(lynq_apn_table[i].apnType)!=0)
631 {
632 lynq_deactive_data_call(&i);
633 }
634 }
635 if(lynq_client_sockfd>0)
636 {
637 close(lynq_client_sockfd);
638 }
rjw7ee7bb42023-01-18 11:34:28 +0800639 ret = lynq_deinit_data_urc_thread();
rjweb65a2f2023-02-01 16:43:23 +0800640 if (ret != 0)
rjw22947c22022-03-15 09:21:29 +0800641 {
rjw7ee7bb42023-01-18 11:34:28 +0800642 LYERRLOG("lynq_deinit_data_urc_thread fail");
643 return ret;
rjw22947c22022-03-15 09:21:29 +0800644 }
rjwc3d6e582023-03-28 17:19:11 +0800645 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
646 s_data_urc_wait_list.clear();
647 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
lhf81a46f2022-02-13 23:57:37 -0800648 return 0;
649}
650int lynq_setup_data_call(int *handle)
651{
Hong_Liue54db8c2023-04-21 02:37:23 -0700652 int error = -1;
653 #ifdef GSW_RIL_CFG //becuase gsw not have connman,data can not be triggered by connman.
654 LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
Hong_Liue9879152023-04-25 20:40:26 -0700655 error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL);
Hong_Liue54db8c2023-04-21 02:37:23 -0700656 #else
lhf81a46f2022-02-13 23:57:37 -0800657 Parcel p;
658 lynq_client_t client;
659 int resp_type = -1;
660 int request = -1;
661 int slot_id = -1;
lhf81a46f2022-02-13 23:57:37 -0800662 int lynq_data_call_id = 0;
663 if(handle==NULL)
664 {
665 LYERRLOG("handle is null!!!");
666 return LYNQ_E_NULL_ANONALY;
667 }
668 client.uToken = Global_uToken;
669 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
670 client.paramLen = 0;
671 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
672 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwc63abb42023-03-31 18:22:42 +0800673 lynq_data_call_id = updateApn("default");
674 if (lynq_data_call_id < 0)
675 {
676 LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
677 return -1;
678 }
rjw733b9832023-04-03 10:20:08 +0800679 lynq_data_call = 1;
rjwed00d042022-05-25 09:18:16 +0800680 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -0800681 if(send_request(lynq_client_sockfd,&client)==-1)
682 {
683 LYERRLOG("send request fail");
684 perror("[LYNQ_DATA] send request fail:");
685 return -1;
686 }
687 get_response(lynq_client_sockfd,p);
rjwed00d042022-05-25 09:18:16 +0800688 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjwfa532972022-09-16 13:39:41 +0800689 JumpHeader(p,&resp_type,&request,&slot_id,&error);
lhf81a46f2022-02-13 23:57:37 -0800690 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lhf81a46f2022-02-13 23:57:37 -0800691 if(error==0)
692 {
rjwf9ec3832023-04-12 10:59:15 +0800693 data_timelimit = 1;
rjw20006d12022-04-21 16:29:04 +0800694 if (waitDataCallstateChange(60000) == ETIMEDOUT) // 60s
lhf81a46f2022-02-13 23:57:37 -0800695 {
696 error = LYNQ_E_TIME_OUT;
697 LYERRLOG("timeout:wait data Call state fail!!!");
698 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
Hong_Liu6149f182023-05-12 02:15:14 -0700699 if (data_invaild_error == 1)
700 {
701 data_invaild_error = 0;
702 LYERRLOG("urc apn info error!!!");
703 return 8085;
704 }
705 printf_apn_table_debug(__FUNCTION__,__LINE__);
lhf81a46f2022-02-13 23:57:37 -0800706 return error;
707 }
708 *handle = lynq_data_call_id;
709 }
Hong_Liu6149f182023-05-12 02:15:14 -0700710 printf_apn_table_debug(__FUNCTION__,__LINE__);
Hong_Liue54db8c2023-04-21 02:37:23 -0700711 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -0800712 return error;
713}
rjw7ee7bb42023-01-18 11:34:28 +0800714
lhf81a46f2022-02-13 23:57:37 -0800715int lynq_deactive_data_call(int *handle)
716{
717 Parcel p;
718 lynq_client_t client;
719 int resp_type = -1;
720 int request = -1;
721 int slot_id = -1;
722 int error = -1;
723 int lynq_data_call_id = -1;
rjw1309e232022-07-22 09:54:06 +0800724 int ret = 0;
lhf81a46f2022-02-13 23:57:37 -0800725 if(handle==NULL)
726 {
727 LYERRLOG("handle is null!!!");
728 return -1;
729 }
rjw1309e232022-07-22 09:54:06 +0800730 ret = handleCheck(*handle);
731 if (ret != 0)
732 {
733 LYERRLOG("incomming handle is invalid");
734 return -1;
735 }
736 lynq_data_call_id = *handle;
lhf81a46f2022-02-13 23:57:37 -0800737 client.uToken = Global_uToken;
738 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
Hong_Liue3d35262023-05-04 00:20:12 -0700739 client.paramLen = 0;
740 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
741 #ifdef GSW_RIL_CFG
742 client.paramLen = 1;
743 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
744 #else
745 if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")!=0)
lh13586612022-01-11 21:58:58 -0800746 {
lhf81a46f2022-02-13 23:57:37 -0800747 client.paramLen = 1;
lhf81a46f2022-02-13 23:57:37 -0800748 sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType);
749 }
Hong_Liue3d35262023-05-04 00:20:12 -0700750 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -0800751 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwed00d042022-05-25 09:18:16 +0800752 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -0800753 if(send_request(lynq_client_sockfd,&client)==-1)
754 {
755 LYERRLOG("send request fail");
756 perror("[LYNQ_DATA] send request fail:");
757 return -1;
758 }
759 get_response(lynq_client_sockfd,p);
rjwed00d042022-05-25 09:18:16 +0800760 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjwfa532972022-09-16 13:39:41 +0800761 JumpHeader(p,&resp_type,&request,&slot_id,&error);
lhf81a46f2022-02-13 23:57:37 -0800762 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
763 cleanOnceApnTable(lynq_data_call_id);
Hong_Liu6149f182023-05-12 02:15:14 -0700764 printf_apn_table_debug(__FUNCTION__,__LINE__);
lhf81a46f2022-02-13 23:57:37 -0800765 return error;
766}
767int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol)
768{
769 Parcel p;
770 lynq_client_t client;
771 int resp_type = -1;
772 int request = -1;
773 int slot_id = -1;
774 int error = -1;
lhf81a46f2022-02-13 23:57:37 -0800775 int lynq_data_call_id = -1;
776 char *argv[10] = {};
Hong_Liue54db8c2023-04-21 02:37:23 -0700777 #ifdef GSW_RIL_CFG
778 LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
779 if(handle==NULL||apnType==NULL)
780 {
781 LYERRLOG("handle or apntype is null!!!");
782 return -1;
783 }
784 #else
lhf81a46f2022-02-13 23:57:37 -0800785 if(handle==NULL||apn==NULL||apnType==NULL)
786 {
787 LYERRLOG("handle ,apn or apntype is null!!!");
788 return -1;
789 }
Hong_Liue54db8c2023-04-21 02:37:23 -0700790 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -0800791 if(user==NULL)
792 {
793 argv[1] = "null";
794 }
795 else
796 {
797 argv[1] = user;
lh13586612022-01-11 21:58:58 -0800798 }
799 if(password==NULL)
800 {
lhf81a46f2022-02-13 23:57:37 -0800801 argv[2] = "null";
lh13586612022-01-11 21:58:58 -0800802 }
803 else
804 {
lhf81a46f2022-02-13 23:57:37 -0800805 argv[2] = password;
lh13586612022-01-11 21:58:58 -0800806 }
807 if(authType==NULL)
808 {
lhf81a46f2022-02-13 23:57:37 -0800809 argv[3] = "null";
lh13586612022-01-11 21:58:58 -0800810 }
811 else
812 {
lhf81a46f2022-02-13 23:57:37 -0800813 argv[3] = authType;
lh13586612022-01-11 21:58:58 -0800814 }
815 if(normalProtocol==NULL)
816 {
lhf81a46f2022-02-13 23:57:37 -0800817 argv[4] = "null";
lh13586612022-01-11 21:58:58 -0800818 }
819 else
820 {
lhf81a46f2022-02-13 23:57:37 -0800821 argv[4] = normalProtocol;
lh13586612022-01-11 21:58:58 -0800822 }
823 if(roamingProtocol==NULL)
824 {
lhf81a46f2022-02-13 23:57:37 -0800825 argv[5] = "null";
lh13586612022-01-11 21:58:58 -0800826 }
827 else
828 {
lhf81a46f2022-02-13 23:57:37 -0800829 argv[5] = roamingProtocol;
830 }
831 client.uToken = Global_uToken;
832 client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL
833 client.paramLen = 7;
834 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
Hong_Liue54db8c2023-04-21 02:37:23 -0700835 #ifdef GSW_RIL_CFG
836 if(NULL == apn)
837 {
838 sprintf(client.param,"null %s %s %s %s %s %s",apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
839 }
840 else
841 {
842 sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
843 }
844 #else
lhf81a46f2022-02-13 23:57:37 -0800845 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 -0700846 #endif //GSW_RIL_CFG
lhf81a46f2022-02-13 23:57:37 -0800847 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwc63abb42023-03-31 18:22:42 +0800848 lynq_data_call_id = updateApn(apnType);
849 if (lynq_data_call_id < 0)
850 {
851 LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
852 return -1;
853 }
rjw733b9832023-04-03 10:20:08 +0800854 lynq_data_call = 1;
rjwed00d042022-05-25 09:18:16 +0800855 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -0800856 if(send_request(lynq_client_sockfd,&client)==-1)
857 {
858 LYERRLOG("send request fail");
859 perror("[LYNQ_DATA] send request fail:");
860 return -1;
861 }
862 get_response(lynq_client_sockfd,p);
rjwed00d042022-05-25 09:18:16 +0800863 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjwfa532972022-09-16 13:39:41 +0800864 JumpHeader(p,&resp_type,&request,&slot_id,&error);
lhf81a46f2022-02-13 23:57:37 -0800865 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lhf81a46f2022-02-13 23:57:37 -0800866 if(error==0)
867 {
rjwf9ec3832023-04-12 10:59:15 +0800868 data_timelimit = 1;
rjw7ee7bb42023-01-18 11:34:28 +0800869 if(waitDataCallstateChange(60000)==ETIMEDOUT)//60s
lhf81a46f2022-02-13 23:57:37 -0800870 {
871 error = LYNQ_E_TIME_OUT;
872 LYERRLOG("timeout:wait data Call state fail!!!");
873 lynq_apn_table[lynq_data_call_id].hasTimeout = 1;
Hong_Liu6149f182023-05-12 02:15:14 -0700874 if (data_invaild_error == 1)
875 {
876 data_invaild_error = 0;
877 LYERRLOG("urc apn info error!!!");
878 return 8085;
879 }
880 printf_apn_table_debug(__FUNCTION__,__LINE__);
lhf81a46f2022-02-13 23:57:37 -0800881 return error;
882 }
883 *handle = lynq_data_call_id;
884 }
Hong_Liu6149f182023-05-12 02:15:14 -0700885 printf_apn_table_debug(__FUNCTION__,__LINE__);
lhf81a46f2022-02-13 23:57:37 -0800886 return error;
887}
888/*
889int lynq_deactive_data_call_sp(int *handle,char *apnType)
890{
891 Parcel p;
892 lynq_client_t client;
893 int resp_type = -1;
894 int request = -1;
895 int slot_id = -1;
896 int error = -1;
897 if(handle==NULL||apnType==NULL)
898 {
899 LYERRLOG("handle is null!!!");
900 return -1;
901 }
902 client.uToken = Global_uToken;
903 client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL
904 client.paramLen = 1;
905 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
906 sprintf(client.param,"%s",apnType);
907 LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
908 if(send_request(lynq_client_sockfd,&client)==-1)
909 {
910 LYERRLOG("send request fail");
911 perror("[LYNQ_DATA] send request fail:");
912 return -1;
913 }
914 get_response(lynq_client_sockfd,p);
rjwfa532972022-09-16 13:39:41 +0800915 JumpHeader(p,&resp_type,&request,&slot_id,&error);
lhf81a46f2022-02-13 23:57:37 -0800916 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
917 return error;
918}
919*/
920int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum)
921{
922 Parcel p;
923 lynq_client_t client;
924 int resp_type = -1;
q.huang7de1d662022-09-13 14:19:24 +0800925 int token;
926 int request = -1;
lhf81a46f2022-02-13 23:57:37 -0800927 int slot_id = -1;
928 int error = -1;
929 int version =0;
930 int num = 0;
lhf81a46f2022-02-13 23:57:37 -0800931 char *temp_char = NULL;
932 if(dataCallList==NULL)
933 {
934 LYERRLOG("dataCallList is null!!!");
935 return -1;
936 }
937 client.uToken = Global_uToken;
938 client.request = 57;//RIL_REQUEST_DATA_CALL_LIST
939 client.paramLen = 0;
940 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
941 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwed00d042022-05-25 09:18:16 +0800942 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
lhf81a46f2022-02-13 23:57:37 -0800943 if(send_request(lynq_client_sockfd,&client)==-1)
944 {
945 LYERRLOG("send request fail");
946 perror("[LYNQ_DATA] send request fail:");
947 return -1;
948 }
949 get_response(lynq_client_sockfd,p);
rjwed00d042022-05-25 09:18:16 +0800950 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjwfa532972022-09-16 13:39:41 +0800951 if(p.dataAvail() > 0)
952 {
rjw0fb4ccb2022-09-16 19:12:35 +0800953 p.readInt32(&resp_type);
954 p.readInt32(&token);
955 p.readInt32(&request);
956 p.readInt32(&slot_id);
957 p.readInt32(&error);
rjwfa532972022-09-16 13:39:41 +0800958 }
959 else
960 {
961 return -1;
962 }
lhf81a46f2022-02-13 23:57:37 -0800963 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
964 p.readInt32(&version);
965 if(version==11)
966 {
967 p.readInt32(&num);
968 *realNum = num;
969 for (int i = 0; i < num; i++)
970 {
971 p.readInt32(&dataCallList[i].status);
972 p.readInt32(&dataCallList[i].suggestedRetryTime);
973 p.readInt32(&dataCallList[i].cid);
974 p.readInt32(&dataCallList[i].active);
975 temp_char = strdupReadString(p);
Hong_Liu6149f182023-05-12 02:15:14 -0700976 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
977 if(temp_char)
978 {
979 memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1);
980 free(temp_char);
981 }
lhf81a46f2022-02-13 23:57:37 -0800982 temp_char = strdupReadString(p);
Hong_Liu6149f182023-05-12 02:15:14 -0700983 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
984 if(temp_char)
985 {
986 memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1);
987 free(temp_char);
988 }
lhf81a46f2022-02-13 23:57:37 -0800989 temp_char = strdupReadString(p);
Hong_Liu6149f182023-05-12 02:15:14 -0700990 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
991 if(temp_char)
992 {
993 memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1);
994 free(temp_char);
995 }
lhf81a46f2022-02-13 23:57:37 -0800996 temp_char = strdupReadString(p);
Hong_Liu6149f182023-05-12 02:15:14 -0700997 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
998 if(temp_char)
999 {
1000 memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1);
1001 free(temp_char);
1002 }
lhf81a46f2022-02-13 23:57:37 -08001003 temp_char = strdupReadString(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001004 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1005 if(temp_char)
1006 {
1007 memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1);
1008 free(temp_char);
1009 }
lhf81a46f2022-02-13 23:57:37 -08001010 temp_char = strdupReadString(p);
Hong_Liu6149f182023-05-12 02:15:14 -07001011 LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char);
1012 if(temp_char)
1013 {
1014 memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1);
1015 free(temp_char);
1016 }
lhf81a46f2022-02-13 23:57:37 -08001017 p.readInt32(&dataCallList[i].mtu);
1018 }
1019 }
1020 return error;
1021}
1022int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList)
1023{
1024 lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};
1025 int number = 0;
1026 int lynq_data_call_id = 0;
1027 int error = 0;
1028 lynq_data_call_id = *handle;
1029 if(handle==NULL)
1030 {
1031 LYERRLOG("handle is NULL");
1032 return LYNQ_E_NULL_ANONALY;
1033 }
rjw3938f262023-03-08 16:09:28 +08001034 if (*handle<0 && handle>8)
1035 {
1036 LYERRLOG("handle value error");
1037 }
1038 LYINFLOG("incoming handle value: %d",*handle);
lhf81a46f2022-02-13 23:57:37 -08001039 memset(interDataCallList,0,sizeof(interDataCallList));
1040 error = getDataCallLists(interDataCallList,&number);
1041 if(error == 0)
1042 {
1043 for(int i = 0;i < number;i++)
1044 {
1045 if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0)
1046 {
1047 dataCallList->active = interDataCallList[i].active;
1048 dataCallList->suggestedRetryTime = interDataCallList[i].suggestedRetryTime;
1049 dataCallList->cid = interDataCallList[i].cid;
1050 dataCallList->status = interDataCallList[i].status;
1051 dataCallList->mtu = interDataCallList[i].mtu;
1052 memcpy(dataCallList->addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses));
1053 memcpy(dataCallList->ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname));
1054 memcpy(dataCallList->dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses));
1055 memcpy(dataCallList->type,interDataCallList[i].type,sizeof(interDataCallList[i].type));
1056 memcpy(dataCallList->gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways));
1057 memcpy(dataCallList->pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf));
1058 LYDBGLOG("ifname:%s,addr:%s",dataCallList->ifname,dataCallList->addresses);
1059 }
1060 }
1061 }
1062 return error;
1063}
1064int lynq_wait_data_call_state_change(int *handle)
1065{
rjwc3d6e582023-03-28 17:19:11 +08001066 if (data_waiting_status == 1)
1067 {
1068 LYDBGLOG("some thread is waiting");
1069 return -3;
1070 }
1071 LYDBGLOG("is empty :%d",s_data_urc_wait_list.empty());
1072 if (s_data_urc_wait_list.empty())
1073 {
1074 LYDBGLOG("start wait");
1075 data_waiting_status = 1;
1076 waitPdnChange();
1077 }
1078 data_waiting_status = 0;
rjw7ee7bb42023-01-18 11:34:28 +08001079 std::vector<int>::iterator iter;
rjw7ee7bb42023-01-18 11:34:28 +08001080
1081 pthread_mutex_lock(&s_lynq_urc_vector_mutex);
1082 iter = s_data_urc_wait_list.begin();
rjwc3d6e582023-03-28 17:19:11 +08001083 if (iter != s_data_urc_wait_list.end())
1084 {
1085 *handle = *iter;
1086 }
rjw7ee7bb42023-01-18 11:34:28 +08001087 s_data_urc_wait_list.erase(iter);
1088 pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
1089
rjw3938f262023-03-08 16:09:28 +08001090 LYINFLOG("lynq data call id:%d",*handle);
lhf81a46f2022-02-13 23:57:37 -08001091 return 0;
1092}
1093/*Warren add for T800 platform 2021/11/19 end*/
rjw20006d12022-04-21 16:29:04 +08001094
1095/*Typethree add for T800 platform 2022/04/21 start*/
rjw61fcae32022-08-18 14:03:39 +08001096
1097int 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 +08001098{
1099 char strtmp[10][32];
rjw61fcae32022-08-18 14:03:39 +08001100 if (id == NULL)
rjw0cdacbc2022-06-22 10:51:07 +08001101 {
rjw61fcae32022-08-18 14:03:39 +08001102 sprintf(strtmp[0], "id=;");
rjw0cdacbc2022-06-22 10:51:07 +08001103 }
rjw61fcae32022-08-18 14:03:39 +08001104 else
rjw0cdacbc2022-06-22 10:51:07 +08001105 {
rjw61fcae32022-08-18 14:03:39 +08001106 sprintf(strtmp[0], "id=%s;", id);
rjw0cdacbc2022-06-22 10:51:07 +08001107 }
rjw20006d12022-04-21 16:29:04 +08001108 if (mcc == NULL)
1109 {
1110 sprintf(strtmp[1], "mcc=;");
1111 }
1112 else
1113 {
1114 sprintf(strtmp[1], "mcc=%s;", mcc);
1115 }
1116 if (mnc == NULL)
1117 {
rjw61fcae32022-08-18 14:03:39 +08001118 sprintf(strtmp[2], "mnc=;");
rjw20006d12022-04-21 16:29:04 +08001119 }
1120 else
1121 {
1122 sprintf(strtmp[2], "mnc=%s;", mnc);
1123 }
1124 if (apn == NULL)
1125 {
1126 sprintf(strtmp[3], "apn=;");
1127 }
1128 else
1129 {
1130 sprintf(strtmp[3], "apn=%s;", apn);
1131 }
1132 if (apntype == NULL)
1133 {
1134 sprintf(strtmp[4], "apntype=;");
1135 }
1136 else
1137 {
1138 sprintf(strtmp[4], "apntype=%s;", apntype);
1139 }
1140 if (user == NULL)
1141 {
1142 sprintf(strtmp[5], "user=;");
1143 }
1144 else
1145 {
1146 sprintf(strtmp[5], "user=%s;", user);
1147 }
1148 if (password == NULL)
1149 {
1150 sprintf(strtmp[6], "password=;");
1151 }
1152 else
1153 {
1154 sprintf(strtmp[6], "password=%s;", password);
1155 }
1156 if (normalprotocol == NULL)
1157 {
1158 sprintf(strtmp[7], "normalprotocol=;");
1159 }
1160 else
1161 {
1162 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1163 }
1164 if (roamingprotocol == NULL)
1165 {
1166 sprintf(strtmp[8], "roamingprotocol=;");
1167 }
1168 else
1169 {
1170 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1171 }
1172 if (carrier == NULL)
1173 {
1174 sprintf(strtmp[9], "carrier=;");
1175 }
1176 else
1177 {
1178 sprintf(strtmp[9], "carrier=%s;", carrier);
1179 }
rjw61fcae32022-08-18 14:03:39 +08001180 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 +08001181
rjw20006d12022-04-21 16:29:04 +08001182 return 0;
1183}
1184
1185int 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)
1186{
1187 char strtmp[10][32];
1188 if (id == NULL)
1189 {
1190 sprintf(strtmp[0], "id=;");
1191 }
1192 else
1193 {
1194 sprintf(strtmp[0], "id=%s;", id);
1195 }
1196 if (mcc == NULL)
1197 {
1198 sprintf(strtmp[1], "mcc=;");
1199 }
1200 else
1201 {
1202 sprintf(strtmp[1], "mcc=%s;", mcc);
1203 }
1204 if (mnc == NULL)
1205 {
1206 sprintf(strtmp[2], "mnc=;");
1207 }
1208 else
1209 {
1210 sprintf(strtmp[2], "mnc=%s;", mnc);
1211 }
1212 if (apn == NULL)
1213 {
1214 sprintf(strtmp[3], "apn=;");
1215 }
1216 else
1217 {
1218 sprintf(strtmp[3], "apn=%s;", apn);
1219 }
1220 if (apntype == NULL)
1221 {
1222 sprintf(strtmp[4], "apntype=;");
1223 }
1224 else
1225 {
1226 sprintf(strtmp[4], "apntype=%s;", apntype);
1227 }
1228 if (user == NULL)
1229 {
1230 sprintf(strtmp[5], "user=;");
1231 }
1232 else
1233 {
1234 sprintf(strtmp[5], "user=%s;", user);
1235 }
1236 if (password == NULL)
1237 {
1238 sprintf(strtmp[6], "password=;");
1239 }
1240 else
1241 {
1242 sprintf(strtmp[6], "password=%s;", password);
1243 }
1244 if (normalprotocol == NULL)
1245 {
1246 sprintf(strtmp[7], "normalprotocol=;");
1247 }
1248 else
1249 {
1250 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1251 }
1252 if (roamingprotocol == NULL)
1253 {
1254 sprintf(strtmp[8], "roamingprotocol=;");
1255 }
1256 else
1257 {
1258 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1259 }
1260 if (carrier == NULL)
1261 {
1262 sprintf(strtmp[9], "carrier=;");
1263 }
1264 else
1265 {
1266 sprintf(strtmp[9], "carrier=%s;", carrier);
1267 }
1268 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]);
1269 return 0;
1270}
1271
rjwaf4b1612022-06-13 17:26:01 +08001272
1273int 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)
1274{
1275 char strtmp[10][32];
1276 if (id == NULL)
1277 {
1278 sprintf(strtmp[0], "");
1279 }
1280 else
1281 {
1282 sprintf(strtmp[0], "id=%s;", id);
1283 }
1284 if (mcc == NULL)
1285 {
1286 sprintf(strtmp[1], "");
1287 }
1288 else
1289 {
1290 sprintf(strtmp[1], "mcc=%s;", mcc);
1291 }
1292 if (mnc == NULL)
1293 {
1294 sprintf(strtmp[2], "");
1295 }
1296 else
1297 {
1298 sprintf(strtmp[2], "mnc=%s;", mnc);
1299 }
1300 if (apn == NULL)
1301 {
1302 sprintf(strtmp[3], "");
1303 }
1304 else
1305 {
1306 sprintf(strtmp[3], "apn=%s;", apn);
1307 }
1308 if (apntype == NULL)
1309 {
1310 sprintf(strtmp[4], "");
1311 }
1312 else
1313 {
1314 sprintf(strtmp[4], "apntype=%s;", apntype);
1315 }
1316 if (user == NULL)
1317 {
1318 sprintf(strtmp[5], "");
1319 }
1320 else
1321 {
1322 sprintf(strtmp[5], "user=%s;", user);
1323 }
1324 if (password == NULL)
1325 {
1326 sprintf(strtmp[6], "");
1327 }
1328 else
1329 {
1330 sprintf(strtmp[6], "password=%s;", password);
1331 }
1332 if (normalprotocol == NULL)
1333 {
1334 sprintf(strtmp[7], "");
1335 }
1336 else
1337 {
1338 sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
1339 }
1340 if (roamingprotocol == NULL)
1341 {
1342 sprintf(strtmp[8], "");
1343 }
1344 else
1345 {
1346 sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
1347 }
1348 if (carrier == NULL)
1349 {
1350 sprintf(strtmp[9], "");
1351 }
1352 else
1353 {
1354 sprintf(strtmp[9], "carrier=%s;", carrier);
1355 }
1356 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]);
1357 return 0;
1358}
1359
rjw20006d12022-04-21 16:29:04 +08001360static char *lynqStrdupReadString(Parcel &p)
1361{
1362 size_t stringlen;
1363 const char16_t *s16;
1364
1365 s16 = p.readString16Inplace(&stringlen);
1366 return strndup16to8(s16, stringlen);
1367}
1368
1369int 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)
1370{
1371 if (NULL == id && NULL == mcc && NULL == mnc && NULL == apn && NULL == apntype && NULL == user && NULL == password && NULL == normalprotocol && NULL == roamingprotocol && NULL == carrier)
1372 {
1373 LYERRLOG("There are no valid parameters");
1374 return -1;
1375 }
1376 lynq_client_t client;
1377 char argc[512];
rjw0cdacbc2022-06-22 10:51:07 +08001378 int res = 0;
rjw20006d12022-04-21 16:29:04 +08001379 Parcel p;
1380 if (cmd == 0) // insert apn db
1381 {
rjw61fcae32022-08-18 14:03:39 +08001382 res = insert_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
1383
rjw20006d12022-04-21 16:29:04 +08001384 client.uToken = Global_uToken;
1385 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1386 client.paramLen = 2;
1387 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1388 sprintf(client.param, "%d %s", cmd, argc);
1389 }
rjw61fcae32022-08-18 14:03:39 +08001390 else if (cmd == 1) //delete apn db
rjw20006d12022-04-21 16:29:04 +08001391 {
1392 if (NULL == id)
1393 {
1394 LYERRLOG("id is NULL!!!please input id: ");
1395 }
1396 sprintf(argc, "id=%s", id);
1397 client.uToken = Global_uToken;
1398 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1399 client.paramLen = 2;
1400 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1401 sprintf(client.param, "%d %s", cmd, argc);
1402 }
rjw61fcae32022-08-18 14:03:39 +08001403 else if (cmd == 2) //query apn db
rjw20006d12022-04-21 16:29:04 +08001404 {
rjwaf4b1612022-06-13 17:26:01 +08001405 query_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
rjw20006d12022-04-21 16:29:04 +08001406 client.uToken = Global_uToken;
1407 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1408 client.paramLen = 2;
1409 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1410 sprintf(client.param, "%d %s", cmd, argc);
1411 }
rjw61fcae32022-08-18 14:03:39 +08001412 else if (cmd == 3) //modify apn db
rjw20006d12022-04-21 16:29:04 +08001413 {
1414 modify_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier);
1415 client.uToken = Global_uToken;
1416 client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN
1417 client.paramLen = 2;
1418 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1419 sprintf(client.param, "%d %s", cmd, argc);
1420 }
1421 else
1422 {
1423 LYERRLOG("incoming command is invalid");
1424 return -1;
1425 }
1426 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rjwed00d042022-05-25 09:18:16 +08001427 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001428 if(send_request(lynq_client_sockfd,&client)==-1)
1429 {
1430 LYERRLOG("send request fail");
1431 return -1;
1432 }
rjwed00d042022-05-25 09:18:16 +08001433 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001434 waitApnResult();
rjw3bcbbf12022-04-22 16:47:18 +08001435 strcpy(out, g_lynq_apn_result);
rjw20006d12022-04-21 16:29:04 +08001436 LYINFLOG(">>>>>output info:%s",out);
1437 return 0;
1438}
1439
1440int lynq_reset_apn(char *result)
1441{
1442 Parcel p;
1443 lynq_client_t client;
rjw3bcbbf12022-04-22 16:47:18 +08001444 if (NULL == result)
1445 {
1446 LYERRLOG("incoming paramters error");
1447 }
rjw20006d12022-04-21 16:29:04 +08001448 client.uToken = Global_uToken;
1449 client.request = 2000 + 194;
1450 client.paramLen = 0;
1451 bzero(client.param, LYNQ_REQUEST_PARAM_BUF);
1452 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s", client.uToken, client.request, client.paramLen, client.param);
rjwed00d042022-05-25 09:18:16 +08001453 pthread_mutex_lock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001454 if (send_request(lynq_client_sockfd, &client) == -1)
1455 {
1456 LYERRLOG("send request fail");
1457 return -1;
1458 }
rjwed00d042022-05-25 09:18:16 +08001459 pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
rjw20006d12022-04-21 16:29:04 +08001460 waitApnResult();
1461 strcpy(result, g_lynq_apn_result);
1462 LYINFLOG(">>>>>result:%s",result);
1463 return 0;
1464}
1465
rjw3bcbbf12022-04-22 16:47:18 +08001466/*Typethree add for T800 platform 2022/04/21 end*/